free()
调用会失败吗?
例如:
free(NULL);
释放一个空指针不会失败。而且free
函数不会返回任何错误,但释放未分配的内存、已经释放的内存或已分配块的中间部分是未定义行为 - 可能会导致内存错误并使程序中止(或更糟糕的是,它将损坏堆结构并在后续崩溃)。
甚至比这更糟糕的是,继续运行但完全破坏您的数据并将其写入磁盘,而你却没有察觉 :-)
标准文件(C99)的相关部分是第7.20.3.2
节:
#include <stdlib.h>
void free(void *ptr);
free
函数会释放指向ptr
的空间,即可供进一步分配使用。如果ptr
是空指针,则不执行任何操作。否则,如果参数与之前由calloc
、malloc
或realloc
函数返回的指针不匹配,或者该空间已被free
或realloc
调用释放,则行为是未定义的。
free
函数不返回任何值。
除非你引起未定义行为(例如“双重释放”或尝试free()
一个字符串常量),否则free()
不会失败。
free(NULL)
不做任何操作;对于一个不是通过相同的分配器(malloc
,calloc
等)分配或已被释放的指针进行free
操作是未定义的。由于free
返回void
,所以它失败的唯一方式是崩溃(例如段错误)。
是的,它可以在多种情况下失败。例如:
free()
可能会失败,例如在存在内存损坏的情况下:char *p = malloc(1000);
*(p-1)=7;
free(p);
虽然这只是一个人为制造的例子,但类似的事情也可能发生在数组的末尾或开头。你可能第一次知道它是在free()
中出现保护错误。