找到内存泄漏

时间:2014-08-13 14:30:49

标签: c++ visual-studio-2012 memory-leaks

我目前正在调试一些代码,使用带有CrtDbg的Visual Studio 2012删除或至少查找内存泄漏。

问题是,只要分配数量不变,追踪分配就相当容易了。当分配数量发生很大变化(或者不是真正的确定性)时,如何找到泄漏的分配点?我至少可以说,哪个模块正在分配内存?

关闭应用程序时我有以下几行:

Detected memory leaks!
Dumping objects ->
{2789444} normal block at 0x0000000006103CB0, 32 bytes long.
 Data: < q f            > B8 71 E4 66 00 00 00 00 00 00 00 00 00 00 00 00 
{1269709} normal block at 0x000000000A50C6A0, 1008 bytes long.
 Data: <        )       > 01 00 00 00 0B 00 00 00 29 00 00 00 CD CD CD CD 
...
{2194} normal block at 0x0000000000278060, 16 bytes long.
 Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
Object dump complete.

最后一个分配编号2194是可重现的,与静态初始化程序有关。但其他数字正在发生变化。

我不能使用地址找到它吗?或者有一个更简单的解决方案吗?

帮助会很棒。

4 个答案:

答案 0 :(得分:1)

我建议你使用视觉检漏仪。我应该为您提供所需的所有详细信息,以便跟踪泄漏并且易于安装。 见here

答案 1 :(得分:1)

试试Debug Diagnostic Tool v2.0,它是Windows上非常好的内存驱动程序工具,它​​来自Microsoft,它是免费的。

如果第三方库泄漏内存,该工具可以找到库,只是没有调用堆栈信息。

要通过此调试器启动exe,请转到菜单&#39;工具&#39; - &gt;&#34;预连接配置&#39;,为您的exe启用预连接调试器。

答案 2 :(得分:0)

下载visual-leak-detector并开始以下操作:

创建以下目录结构:

Visual Leak Detector
    include
        vld.h
        vld_def.h
    lib
        Win32
            vld.lib
        Win64
            vld.lib
    bin
        Win32
            vld_x86.dll
        Win64
            vld_x64.dll

在主要功能上方添加以下内容:

#ifdef _DEBUG_MEM
#include <vld.h>
#endif

在项目设置中添加以下内容:

_DEBUG_MEM in the preprocessor-definitions
Visual Leak Detector\include in the include-path
Visual Leak Detector\lib\Win<xx> in the library-path
Visual Leak Detector\bin\Win<xx> in the executable-path

答案 3 :(得分:0)

您可以使用以下技术:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
class MemChecker 
{
   friend class foo;
   struct foo 
   {
      HANDLE hLogFile;
      _CrtMemState _ms; 

      foo() 
      {
         hLogFile = CreateFile(TEXT("memory_leaks.txt"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

         _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); // enable file output
         _CrtSetReportFile( _CRT_WARN, hLogFile ); // set file to stdout
         _CrtMemCheckpoint(&_ms); // now forget about objects created before

         // breaks on N-th memory allocation
         // look for this number in report file (in curved brackets)
         //_CrtSetBreakAlloc(1518);
      }
      ~foo() 
      { 
         _CrtMemDumpAllObjectsSince(&_ms); // dump leaks
         CloseHandle(hLogFile);
      }
   };
   static foo obj;
};
MemChecker::foo MemChecker::obj;

使用此声明,每次运行程序时,都会以适当的方式检测并报告内存泄漏。

此外,您可以将断点设置为特别的内存泄漏(读取代码中的注释)。怎么做:你运行应用程序,看看,内存泄漏的数量,然后你设置_CrtSetBreakAlloc(2789444 *),所以下次你运行应用程序 - 它打破了分配内存(泄漏)的地方

您可以更仔细地阅读有关标志_CRTDBG_MODE_FILE,_CRTDBG_MODE_DEBUG的信息,以指定调试消息将被输出的位置。

*来自您的示例,{2789444}正常块位于0x0000000006103CB0,32个字节长。