free()
的来电能否以任何方式失败?
例如:
free(NULL);
答案 0 :(得分:32)
释放NULL指针不会失败。并且free
不会返回任何错误,但释放未分配的内存,已释放的内存或已分配的块的中间是未定义的行为 - 它可能会导致内存错误并且程序可能会中止(或者更糟糕的是,它会损坏堆结构并在以后崩溃。)
或者,更糟糕的是,继续运行但是完全损坏了数据并将其写入磁盘而没有意识到: - )
标准的相关部分(C99)是7.20.3.2
部分:
#include <stdlib.h>
void free(void *ptr);
free
函数导致ptr
指向的空间被释放,即可用于进一步分配。如果ptr
是空指针,则不执行任何操作。否则,如果参数与先前calloc
,malloc
或realloc
函数返回的指针不匹配,或者通过调用free
已释放空间或realloc
,行为未定义。
free
函数不返回任何值。
答案 1 :(得分:6)
free(NULL)
什么都不做;未分配相同分配器(free
,malloc
等)或已释放的指针上的calloc
未定义。由于free
返回void
,因此失败的唯一方法是崩溃(例如段错误)。
答案 2 :(得分:5)
除非您调用未定义的行为(例如“double-free”或尝试free()
字符串文字)free()
不能失败。
答案 3 :(得分:2)
是的,它可能在多种情况下失败。 E.g。
答案 4 :(得分:1)
答案 5 :(得分:0)
根据实施情况,如果存在内存损坏,free()
可能会失败,例如:
char *p = malloc(1000);
*(p-1)=7;
free(p);
虽然这是一个人为的例子,但是通过运行数组的结束或开始可能会发生类似的事情。您可能知道的第一个是free()
中的保护错误。