我怎么知道,已成功释放已分配的空间?

时间:2011-05-02 13:00:57

标签: c memory

有谁知道,我们如何验证分配的空间是否已成功释放?在手册页中,它表示“free()不返回任何值”。

4 个答案:

答案 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函数将内存归零。