gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:09:54 24 4
gpt4 key购买 nike

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

free(array1); // array1 is NULL

我实际上是在一个空指针上调用了 free。据我了解,不小心在 NULL 指针上调用 free 是安全的。但是,当执行 free 语句时,我得到了以下弹出消息。

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

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

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

最佳答案

在 NULL 指针上调用 free() 绝对是安全的,所以您一定早先损坏了堆。也就是说,可能值得在崩溃前放入一条打印语句以保证 array1 确实为 NULL。如果您不能发现错误,您可能不得不求助于工具来帮助您 - 关于此类堆使用验证工具有很多问题。

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

当然,你应该检查new/new[]/malloc-or-realloc是否正确随处与delete/delete[]/realloc-或-free配对。不过,在 C++ 中使用 malloc/free 是有正当理由的——最明显的原因是为了与 C 代码的互操作性,偶尔也是因为使用重新分配

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

关于c++ - 释放空指针会导致以下弹出消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20942233/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com