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

Tai*_*man 24 c free memory-management

呼叫可以free()以任何方式失败吗?

例如:

free(NULL);
Run Code Online (Sandbox Code Playgroud)

E.B*_*oît 32

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

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

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

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

free函数使得指向的空间ptr被释放,即可用于进一步分配.如果ptr是空指针,则不执行任何操作.否则,如果该参数不匹配的指针早些时候返回calloc,mallocrealloc功能,或如果空间已释放通过调用free或者realloc,该行为是不确定的.

free函数不返回任何值.

  • @paxdiablo:不,真正讨厌的事情是,它经常在一个广泛的平台上持续工作,因此有数十亿开发人员认为它没关系,因为"他们已经做了很多年". (10认同)
  • 不会"会导致","可能导致".关于未定义行为的真正烦人之处在于它有时会起作用. (8认同)
  • +1用于区分"失败"和未定义的行为.你是对的,免费没有失败的情况.导致UB的无效输入是一个单独的事情. (2认同)

Gab*_*abe 6

free(NULL)什么也没做; free上不与相同分配器(分配的指针malloc,calloc等等)或者已经释放是不确定的.自从free返回以来void,它失败的唯一方法就是崩溃(例如段错误).


sha*_*oth 5

除非您调用未定义的行为(如"double-free"或尝试free()使用字符串文字)free()否则不会失败.