可以在C中调用free()失败吗?
可以以任何方式调用free()
吗?
例如:
free(NULL);
释放NULL指针不会失败。 free
并不返回任何错误,但释放未分配的内存,已释放的内存或已分配的块的中间是未定义的行为 – 它可能导致内存错误,程序可能会中止(或者更糟糕的是,它会破坏堆结构和之后崩溃)。
或者,甚至更糟糕的是,继续运行但是完全破坏了您的数据并将其写入磁盘而您没有意识到:-)
标准(C99)的相关部分是第7.20.3.2
节:
#include
void free(void *ptr);
free
函数导致ptr
指向的空间被释放,即可用于进一步分配。 如果ptr
是空指针,则不执行任何操作。 否则,如果参数与之前由calloc
,malloc
或realloc
函数返回的指针不匹配,或者如果通过调用free
或realloc
释放了空间,则行为未定义。
free
函数不返回任何值。
free(NULL)
什么都不做; 未分配相同分配器( malloc
, calloc
等)或已释放的指针上的free
是未定义的。 由于free
返回void
,它失败的唯一方法是崩溃(例如段错误)。
除非你调用未定义的行为(比如“double-free”或尝试free()
一个字符串文字) free()
不能失败。
是的,它可能在多种情况下失败。 例如
- 你释放了一些没有动态分配的东西。例如堆栈上的变量
- 您分配一个指针并尝试释放指针+ 1
free(NULL);
允许使用空指针调用free()并且不会导致错误 – 请参阅: free() – Opengroup
使用以前免费的指针调用通常会导致段违规并终止您的程序。
根据实现,如果存在内存损坏, free()
可能会失败,例如:
char *p = malloc(1000); *(p-1)=7; free(p);
虽然这是一个人为的例子,但是通过运行数组的结束或开始可能会发生类似的事情。 第一个你可能知道它是free()
的保护错误。