为什么double free()不会崩溃程序?

时间:2017-06-03 17:33:48

标签: c malloc free

根据我的理解,下面的程序可能已经崩溃,因为释放已释放的内存,但事实并非如此。在我的Linux机器上运行。

#include <stdio.h>
#include <malloc.h>
int main(void) {
      int *ptr1 = NULL;
      ptr1 = malloc(100);
      free(ptr1);
      free(ptr1);
      printf("%d\n", *ptr1);
      return 0;
}

1 个答案:

答案 0 :(得分:1)

根据free的定义,双free实现了未定义的行为:

  

7.20.3.2自由功能

     

free函数导致ptr指向的空间被释放,即可以进一步使用   分配。如果ptr是空指针,则不执行任何操作。否则,如果   参数与calloc返回的指针不匹配,   malloc,或realloc函数,或者如果空间已被释放   对free或realloc的调用,行为未定义

未定义的行为本身在以下标准中定义:

  

3.4.3(1)未定义的行为

     

行为,使用不可移植或错误的程序构造或   错误的数据,本国际标准没有规定   要求注意可能的未定义行为包括忽略   情况完全不可预测的结果,在表现期间   以文件化的方式执行翻译或程序执行   环境(有或没有发布诊断   消息),终止翻译或执行(与发行   诊断信息)

因此,具有未定义行为的程序可能会崩溃&#34;但它也可能不会。这是未定义的......