C-为什么Double Free()不会崩溃程序



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

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

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

7.20.3.2免费功能

免费功能会导致PTR指向的空间被划分,也就是说可用于进一步 分配。如果PTR是无效的指针,则不会发生任何动作。否则,如果 该参数不匹配Calloc返回的指针, Malloc或Realloc功能,,或者是否已通过 呼吁免费或Realloc,该行为是未定义的

和未定义的行为本身以与以下标准相同的标准定义:

3.4.3(1(未定义的行为

行为,使用不可移动或错误的程序构造或 错误的数据,该国际标准毫不 要求注意可能的未定义行为范围从忽略 局势完全有不可预测的结果,在 以记录的方式进行翻译或程序执行 环境(有或没有诊断的情况下 消息(,终止翻译或执行(发行 诊断消息(

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

最新更新