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

Freeing a null pointer causes following pop up message

本文关键字:消息 空指针 释放      更新时间:2023-10-16

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

free(array1); // array1 is NULL

我本质上是在一个空指针上调用free。我的理解是,意外地在NULL指针上调用free是安全的。然而,当执行free语句时,我得到了以下弹出窗口。

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

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

当我取消对free语句的注释时,一切正常。

在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的就地增长带来潜在的性能优势。

"当我取消对free语句的注释时,一切正常。"-最好不要依赖于此。。。如果你的程序滥用堆,它可能会在任何时候崩溃,例如一些运行而不是其他运行,在你的代码中任何地方看似最微小的无关更改之后,在更改编译器标志之后,使用无害的输入更改,甚至在另一台电脑上部署相同的可执行文件。…