释放2个具有相同地址的指针

时间:2017-03-23 12:23:01

标签: c pointers free

我有以下2个代码示例:

char *p1, *p2;
...
p1 = strdup("my str");
p2 = p1; 
...
free(p2);
p2 = NULL;
...
free(p1);

以下代码:

p1 = strdup("my str");
...
free(p1);
...
free(p1);
显然,第二个区块因双免费而失败。问题是,为什么第一个代码块成功退出?

3 个答案:

答案 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)

两个代码段都有一个免费的双倍空间。 双重免费是未定义的行为:任何事情都可能发生,包括崩溃或成功退出。

例如,您的first snippet crashes here on coliru

答案 2 :(得分:0)

所以我发现在这种情况下,valgrind没有帮助,但是dmalloc来救援。

debug-malloc library: dumping program, fatal error
   Error: tried to free previously freed pointer (err 61)
Aborted (core dumped)