我有一些内存密集型代码,后跟以下语句
free(array1); // array1 is NULL
我基本上在空指针上调用free。我的理解是,在NULL指针上意外调用free是安全的。但是,当执行自由语句时,我弹出了以下内容。
“Windows在app.exe中触发了断点。 这可能是由于堆的损坏,这表明app.exe或其加载的任何DLL中存在错误。“
这是否意味着free对于调用NULL指针是不安全的,或者这是否表示我的程序中可能存在内存问题?
当我取消注释免费声明时,一切正常。
答案 0 :(得分:4)
在NULL指针上调用free()
肯定是安全的,所以你必须先破坏你的堆。也就是说,可能值得将一个print语句放入以保证array1在崩溃之前确实为NULL。如果您无法发现错误,则可能需要使用工具来帮助您 - 有很多关于此类堆使用验证工具的问题。
支持文档:您使用的是Windows,但API是使用C语言标准化的:请参阅“如果ptr为NULL,则不执行任何操作”。在http://linux.die.net/man/3/free
当然,您应该检查new
/ new[]
/ malloc
- 或 - realloc
与delete
/ delete[]
/ /到处realloc
- 或 - free
。有充分的理由在C ++中使用malloc
/ free
- 最明显的是与C代码的互操作性,偶尔使用realloc
来实现就地增长的潜在性能优势。
“当我取消注释免费声明时,一切正常。” - 最好不要依赖它...如果你的程序误用堆,它可能随时崩溃,例如在更改编译器标志,无害的输入更改,甚至是在另一台PC上部署的相同可执行文件之后,在代码中的任何位置发生最微小的看似无关的更改之后,有些运行而不是其他运行....