有谁知道,我们如何验证分配的空间是否已成功释放?在手册页中,它表示“free()不返回任何值”。
答案 0 :(得分:12)
有三种可能的情况:
free( NULL ); // does nothing, so always works
free( malloc(42) ); // does something, always works
free( 666 ); // undefined behaviour - returned value would be meaningless
因此,测试free()
没有任何意义。
答案 1 :(得分:10)
没有返回值,因为没有失败的情况。 free
总是成功的。没有什么可以检查的。
请注意,这假设您正确使用它。如果将free
作为free
的参数无效的指针传递给malloc
,例如未初始化的指针,指向已释放对象的指针,或指向未通过{获取的对象的指针{1}},然后您的程序有未定义的行为。这不是可报告的错误;相反,它意味着任何事情都可能发生。
答案 2 :(得分:1)
“错误”免费会使您的应用程序崩溃,因此无需确保其有效:)
示例:
#include <stdlib.h>
int main(int argc, char **argv) {
char *a = malloc(sizeof(*a) * 10);
free(a);
free(a);
return 0;
}
$ ./example * glibc检测到 ./example:double free或corruption(fasttop): 0x08a3e008 * * ======= Backtrace:========= /lib/libc.so.6(+0x6c501)[0x17c501]
答案 3 :(得分:0)
如果你想验证堆分配器的内部工作原理,我不会想到一种标准的方法。
如果你想确保重新初始化内存,我建议你在释放前自己清零内存。我不记得保证free
函数将内存归零。