【问题标题】:Memory leaks detection while using Boost使用 Boost 时的内存泄漏检测
【发布时间】:2010-12-01 17:45:40
【问题描述】:

我想使用 _CRTDBG_MAP_ALLOC 获取内存泄漏信息,尤其是文件和行号,但最后我没有得到它们。我只得到这样的东西:

{130} 0x00695128 处的普通块,16 字节长。 数据: 5C A5 45 01 02 00 00 00 01 00 00 00 E8 50 69 00

我已经看到这应该在所有包含之前:

#define _CRTDBG_MAP_ALLOC
#include <cstdlib>
#include <crtdbg.h>

有些人建议在所有源文件中包含所有内容后添加此内容:

#ifdef _DEBUG
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif

但是,在 main.cpp 中,如果我明确添加内存泄漏,它会在我的输出中与行号一起出现!所以它有效,但并非适用于所有...

当我使用 Boost 库时,我怀疑内存泄漏都发生在这些...(shared_ptr ?)的某个地方。但是如何知道这些内存泄漏是从哪里来的呢?

【问题讨论】:

    标签: c++ boost memory-leaks stdafx.h crtdbg.h


    【解决方案1】:

    我认为\ _CRTDBG_MAP_ALLOC 应该与boost 中的仅标头库(例如shared_ptr)一起使用,因为它们已在标头中实现。我非常怀疑你会在 shared_ptr 中发现任何内存泄漏。我什至怀疑 shared_ptr 甚至调用分配堆内存。请记住,这是经过良好测试的代码,很可能是您导致了泄漏。

    由于没有很好的迹象表明泄漏发生在哪里,我猜它是由第三方库中的内存分配引起的,并且该库希望您进行清理。

    【讨论】:

      【解决方案2】:

      通常 _CRTDBG_MAP_ALLOC 不会帮助您处理第 3 方代码。 _CRTDBG_MAP_ALLOC 将正常的内存分配函数(即 malloc)重定向到在编译时采用文件和行号(即 _malloc___dbg)的特殊调试版本。如果第 3 方代码不是使用定义的 _CRTDBG_MAP_ALLOC 构建的,那么您将看不到该信息。此外,这对非 CRT 内存分配函数(即 HeapAlloc、GlobalAlloc、LocalAlloc、VirtualAlloc 等)没有帮助,尽管 boost 几乎肯定会使用 CRT 函数。

      如果分配数一致,您可以在分配发生时使用 _CrtSetBreakAlloc 设置断点,以查看分配内存的代码。另外,请记住,如果您在程序结束时调用 _CrtDumpMemoryLeaks,那么任何全局对象都还没有被破坏,它们的内存将显示在输出中。

      【讨论】:

      • 没错,Boost 可能使用了许多全局变量,这就是为什么我有所有这些“内存泄漏”。使用 CrtSetBreakAlloc 似乎不起作用,它永远不会中断。可能是因为内存分配发生在 Boost 库中?
      【解决方案3】:

      尝试使用 _CrtSetAllocHook 在每次堆分配之前注册回调函数。可以在此处找到使用它来突出显示泄漏的分配行的 GUI 应用程序: Visual Leak Detector

      【讨论】:

        猜你喜欢
        • 2011-11-23
        • 2012-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-28
        • 1970-01-01
        相关资源
        最近更新 更多