如何在 C++ 中分析和捕获双重删除和内存损坏

Posted

技术标签:

【中文标题】如何在 C++ 中分析和捕获双重删除和内存损坏【英文标题】:How to profile and capture double deletion of and memory corruption in c++ 【发布时间】:2010-05-12 20:34:28 【问题描述】:

我有我用 VS 2008 在 windows 7 上用 c++ 编译的应用程序 我遇到了异常,我试图抓住这个我创建的 pdb 文件(因为我在发布时编译)。并查看堆栈的一部分,但它没有给我提示错误在哪里。 我正在寻找免费的方法来解决这个错误。你能推荐一些免费的方法吗?

【问题讨论】:

【参考方案1】:

Visual C++ 内置了相当不错的 C 运行时内存调试工具。

请参阅#define _CRTDBG_MAP_ALLOC,或阅读:The CRT Debug Heap 和 Memory Leak Detection Enabling。

它可以检测到:

内存泄漏 双重删除 在分配的内存结束后写入

如果您有一个可重现的情况,即问题分配总是同时发生,您可以使用 set it 来闯入该分配的调试器。

还有 BoundsChecker、HeapAgent 和 Purify 等商业工具,以及 Fortify 等免费工具,当然您也可以自行开发,但使用内置的 VisualStudio 可以获得很长的路要走。

【讨论】:

柯蒂斯。您是否有 Fortify 下载的链接?提前致谢。 我可以在发布模式下测试它吗? co'z它在哪里是我调试的问题它工作正常 @ossandcad:看起来它最后的安息之地是 Geocities。我在这里找到了一份副本:gnu-darwin.org/www001/src/ports/devel/adime/work/adime-2.2.1/… - IIRC 2.2 是最新版本。 @user63898:我不确定,我想你可以,但可能有很多麻烦。如果有任何帮助,我已经做了很多调试发布版本,并且您在调试中看不到的发布中看到的问题(一旦您考虑到assert() 等等)几乎总是未初始化的变量和竞争条件.也许这会给你一些开始的地方?

以上是关于如何在 C++ 中分析和捕获双重删除和内存损坏的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中释放在 C++ 中分配的内存

C++ 双重释放或损坏(出)

LIST_ENTRY 已损坏(即双重删除)。不知道为啥

如何从 c++ 的方面(方面 c++)释放或删除函数中的分配对象?

在 C++ 中清除堆栈中分配的内存

如何在 C++ 中分配一个大的动态数组?