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

可以以任何方式调用free()吗?

例如:

 free(NULL); 

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

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

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

#include
void free(void *ptr);

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

free函数不返回任何值。

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

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

是的,它可能在多种情况下失败。 例如

  1. 你释放了一些没有动态分配的东西。例如堆栈上的变量
  2. 您分配一个指针并尝试释放指针+ 1
 free(NULL); 

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

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

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

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

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