c++ - 使用/不使用 Visual Leak Detector 在 C++ 中检测内存泄漏

标签 c++ visual-c++ memory-leaks visual-leak-detector

我想在 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、malloc、free是如何拦截的?一些工具使用 #define 来重新定义 new、delete、malloc 和 free,但这依赖于包含文件的正确顺序,如果一个类包含例如一种称为 free 的方法(如 Qt 中的情况)。预处理器也会重新定义这个方法,这可能会导致编译错误或无法解析的外部。

    另一种方法是否决全局 new 和 delete 运算符。这是一个更简洁的解决方案,但失败的是您有一个 3rd 方库,它在库中放置了一个新库,但在标题中删除了(反之亦然)。
  • 如何确定调用的来源。如果 new、delete、... 被 #define 截获,通常是预处理器符号 __FILE____LINE__用于获取泄漏源。但是,如果您的代码中有“通用”功能,例如CreateString(),那么大部分的泄露都会在这些泛型函数中报出来,其实对你帮助不大。

    另一种方法是在运行时获取调用堆栈。使用 Windows StackWalk 函数可以很容易地完成,但根据我的经验,这非常非常慢。一个更快的替代方法是直接获取基指针,并依赖堆栈帧指针(您必须使用/Oy- 进行编译以获取堆栈帧指针)。您可以像这样获取框架(基)指针:_asm mov DWORD PTR [FramePtr], ebp .然后简单地循环并在循环中从 ((ADDR *)FramePtr)[1]; 获取指令指针以及来自 FramePtr = ((ADDR *)FramePtr)[0]; 的下一个帧指针
  • 如何在准确的时刻报告泄漏。就我而言,我希望在应用程序结束时报告泄漏,但为了能够做到这一点,您需要在应用程序结束时使用泄漏报告机制。这意味着如果你想自己报告你的泄漏,你需要依赖在你的应用程序结束时被析构的全局变量(并在全局变量的析构函数中报告泄漏)。对于服务器类型的应用程序,您可能对获取两个时间点之间的内存使用差异更感兴趣。

  • 现在不同的泄漏系统:
  • C RunTime:最后报告泄漏,但没有像样的报告调用堆栈的方法。其拦截对 new、delete、... 调用的方法可能会在与 3rd 方库(如 Qt、Boost 等)结合使用时出现问题
  • 外部 Microsoft 实用程序(如 GFlags、UMDH 等):它们似乎只能记录两个时间点之间的差异。但是,调用堆栈似乎要好得多,尽管 GFlags 实用程序可能会在操作系统中设置标志,这可能会导致应用程序严重减速。
  • 视觉检漏仪。似乎正确地找到了所有泄漏,但在我的情况下它不起作用,因为我有一个 3rd 方 DLL,它只是在其 DllUnload 处中止进程(似乎是 Windows 7 特定问题)。
  • 我个人最喜欢(我敢肯定,人们不会同意我的观点)是编写自己的内存管理器。使用全局new 和delete 操作符可以很容易地进行拦截(有上面提到的可能的问题),你可以像上面描述的那样获取调用堆栈。这种替代方法还依赖于能够在应用程序的最后时刻执行代码。

  • 在选择替代方案时,我发现以下方面对我的情况非常重要:
  • 我希望它在我的应用程序中无缝运行,以便在发生泄漏时立即通知每个开发人员。如果您将泄漏检查推迟到稍后使用 Purify 等外部实用程序时,泄漏查找将更加困难。
  • 我希望在应用程序结束时自动报告泄漏。
  • 我想要尽可能多的泄漏信息(数据,调用堆栈,...)

  • 希望这可以帮助。

    关于c++ - 使用/不使用 Visual Leak Detector 在 C++ 中检测内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3564582/

    相关文章:

    debugging - Visual Studio C++ 禁用代码特定部分的调试

    c++ - VC++ 替换不同对象的定义,GCC 等不

    Perl:转储所有实时数据

    c++ - 如何为C++构建32位的Assimp库?

    c++ - fltk1.3 Fl_Image::draw(边界框)

    c++ - 当一次实现多个 COM 接口(interface)时,我如何向上转换为 IUnknown?

    ios - NSLinguisticTagger 内存泄漏

    python - 在 Python 中丢弃图像时内存泄漏

    c++ - 应用程序中奇怪的执行错误

    c++ - cout 上没有控制台输出