我有以下2个代码示例:
char *p1, *p2;
...
p1 = strdup("my str");
p2 = p1;
...
free(p2);
p2 = NULL;
...
free(p1);
以下代码:
p1 = strdup("my str");
...
free(p1);
...
free(p1);
显然,第二个区块因双免费而失败。问题是,为什么第一个代码块成功退出?
答案 0 :(得分:3)
问题是,为什么第一个代码块成功退出?
两者都导致undefined behaviour并且遇到了同样的问题。一个失败,而另一个不是巧合。这就是UB的工作原理。
但很可能,我预计第一个也会因为双免费而失败。
一个类似的例子:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char *p1, *p2;
p1 = strdup("my str");
p2 = p1;
free(p2);
p2 = NULL;
free(p1);
}
我尝试了http://ideone.com/TwWDRr和我的Linux机器上的双重免费失败。
答案 1 :(得分:0)
两个代码段都有一个免费的双倍空间。 双重免费是未定义的行为:任何事情都可能发生,包括崩溃或成功退出。
答案 2 :(得分:0)
所以我发现在这种情况下,valgrind没有帮助,但是dmalloc来救援。
debug-malloc library: dumping program, fatal error
Error: tried to free previously freed pointer (err 61)
Aborted (core dumped)