可以在C中调用free()失败吗?

时间:2011-03-15 07:38:26

标签: c memory-management free

free()的来电能否以任何方式失败?

例如:

free(NULL);

6 个答案:

答案 0 :(得分:32)

释放NULL指针不会失败。并且free不会返回任何错误,但释放未分配的内存,已释放的内存或已分配的块的中间是未定义的行为 - 它可能会导致内存错误并且程序可能会中止(或者更糟糕的是,它会损坏堆结构并在以后崩溃。)

或者,更糟糕的是,继续运行但是完全损坏了数据并将其写入磁盘而没有意识到: - )

标准的相关部分(C99)是7.20.3.2部分:

  

#include <stdlib.h>
  void free(void *ptr);

     

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

     

free函数不返回任何值。

答案 1 :(得分:6)

free(NULL)什么都不做;未分配相同分配器(freemalloc等)或已释放的指针上的calloc未定义。由于free返回void,因此失败的唯一方法是崩溃(例如段错误)。

答案 2 :(得分:5)

除非您调用未定义的行为(例如“double-free”或尝试free()字符串文字)free()不能失败。

答案 3 :(得分:2)

是的,它可能在多种情况下失败。 E.g。

  1. 你释放了一些没有动态分配的东西。堆栈上的变量
  2. 您分配指针并尝试释放指针+ 1

答案 4 :(得分:1)

free(NULL);

允许使用空指针调用free()并且不会导致错误 - 请参阅:free() - Opengroup

使用之前免费的指针调用通常会导致段违规并终止您的程序。

答案 5 :(得分:0)

根据实施情况,如果存在内存损坏,free()可能会失败,例如:

char *p = malloc(1000);
*(p-1)=7;
free(p);

虽然这是一个人为的例子,但是通过运行数组的结束或开始可能会发生类似的事情。您可能知道的第一个是free()中的保护错误。