我想在 Windows 中检测我的 C++ 程序的内存泄漏。
我也在 MSDN 上阅读了关于 的文档mermoy leak detection 我也开始使用 Visual Leak Detector。
我对泄漏的报告有疑问。
我期待一个带有行号的文件名,但我总是报告下面的文本。
它具有泄漏描述的所有组件(块类型、内存地址、数据等。)
除了文件名和行号。
如果是真的泄漏?
如果是,您知道为什么没有报告文件/行吗?
同时我也在看 this url
谢谢
检测到内存泄漏!
转储对象 ->
{4723} 位于 0x04AFB5B8 的普通块,8 字节长。
数据:2C 3F 00 00 28 3F 00 00
{1476} 位于 0x04AC3B58 的普通块,12 字节长。
数据:00 CD CD CD EB 01 75 4C CA 3D 0B 00
对象转储完成。
最佳答案
我研究了很多不同的跟踪内存泄漏的方法。他们都有自己的优点,但也有缺点。
要了解它们的优缺点,我们必须了解不同的机制和要求:
另一种方法是否决全局 new 和 delete 运算符。这是一个更简洁的解决方案,但失败的是您有一个 3rd 方库,它在库中放置了一个新库,但在标题中删除了(反之亦然)。
__FILE__
和 __LINE__
用于获取泄漏源。但是,如果您的代码中有“通用”功能,例如CreateString(),那么大部分的泄露都会在这些泛型函数中报出来,其实对你帮助不大。另一种方法是在运行时获取调用堆栈。使用 Windows StackWalk 函数可以很容易地完成,但根据我的经验,这非常非常慢。一个更快的替代方法是直接获取基指针,并依赖堆栈帧指针(您必须使用/Oy- 进行编译以获取堆栈帧指针)。您可以像这样获取框架(基)指针:_asm
mov DWORD PTR [FramePtr], ebp
.然后简单地循环并在循环中从 ((ADDR *)FramePtr)[1];
获取指令指针以及来自 FramePtr = ((ADDR *)FramePtr)[0];
的下一个帧指针现在不同的泄漏系统:
在选择替代方案时,我发现以下方面对我的情况非常重要:
希望这可以帮助。
关于c++ - 使用/不使用 Visual Leak Detector 在 C++ 中检测内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3564582/