释放空指针会导致弹出消息

时间:2014-01-06 02:57:05

标签: c++

我有一些内存密集型代码,后跟以下语句

free(array1); // array1 is NULL

我基本上在空指针上调用free。我的理解是,在NULL指针上意外调用free是安全的。但是,当执行自由语句时,我弹出了以下内容。

“Windows在app.exe中触发了断点。 这可能是由于堆的损坏,这表明app.exe或其加载的任何DLL中存在错误。“

这是否意味着free对于调用NULL指针是不安全的,或者这是否表示我的程序中可能存在内存问题?

当我取消注释免费声明时,一切正常。

1 个答案:

答案 0 :(得分:4)

在NULL指针上调用free()肯定是安全的,所以你必须先破坏你的堆。也就是说,可能值得将一个print语句放入以保证array1在崩溃之前确实为NULL。如果您无法发现错误,则可能需要使用工具来帮助您 - 有很多关于此类堆使用验证工具的问题。

支持文档:您使用的是Windows,但API是使用C语言标准化的:请参阅“如果ptr为NULL,则不执行任何操作”。在http://linux.die.net/man/3/free

当然,您应该检查new / new[] / malloc - 或 - reallocdelete / delete[] / /到处realloc - 或 - free。有充分的理由在C ++中使用malloc / free - 最明显的是与C代码的互操作性,偶尔使用realloc来实现就地增长的潜在性能优势。

“当我取消注释免费声明时,一切正常。” - 最好不要依赖它...如果你的程序误用堆,它可能随时崩溃,例如在更改编译器标志,无害的输入更改,甚至是在另一台PC上部署的相同可执行文件之后,在代码中的任何位置发生最微小的看似无关的更改之后,有些运行而不是其他运行....