【问题标题】:How to find where the memory leak is?如何找到内存泄漏的位置?
【发布时间】:2014-08-26 21:42:15
【问题描述】:

我在 main 的末尾添加了以下内容,我得到了内存泄漏报告,但是当我在调试模式下运行它时,没有创建断点来显示我的代码中发生泄漏的位置。我正在使用 VS c++ 2010 express。是我做错了什么还是我添加的代码有问题。如果有帮助,我可以发布更多代码。

#ifdef _WIN32
if (_CrtDumpMemoryLeaks()) {
    cout << "Memory leaks!" << endl;
}
#endif

#ifdef _DEBUG
int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
flag |= _CRTDBG_LEAK_CHECK_DF; // Turn on leak-checking bit
_CrtSetDbgFlag(flag);
_CrtSetBreakAlloc(427);
#endif

【问题讨论】:

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


【解决方案1】:
int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
flag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag(flag);

这足以启用内存泄漏检测。不要直接拨打_CrtSetDbgFlag。 但是,为了获得调用泄漏分配的源代码行,您需要做更多的事情。

将这些行添加到每个 .cpp 文件的开头,紧跟在所有 #include 行之后:

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

对于 MFC 项目,这就足够了,MFC 标头包含DEBUG_NEW。对于非 MFC 项目,创建文件 DebugNew.h:

#pragma once

#include "crtdbg.h"

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

将它包含在每个 .cpp 文件中。内存泄漏报告现在应该如下所示:

Detected memory leaks!
Dumping objects ->
c:\projects\test\main.cpp(20) : {181}     normal block at 0x005A80F8, 100 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete.

【讨论】:

    【解决方案2】:

    http://msdn.microsoft.com/en-us/library/4wth1ha5.aspx

    首先我认为您在此处发布的这些代码集需要放在主函数体的第一行,但我不确定。

    据我所知,当应用程序尝试分配作为参数传递的位置时,_CrtSetBreakAlloc 函数会让调试器中断。

    当调试器将内存泄漏转储到输出窗口时,您是否获得内存位置? 您必须复制该位置并在下次运行时将其用作 _CrtSetBreakAlloc 调用的参数。(例如下面输出中的数字 276)

    Dumping objects ->
    {276} normal block at 0x007AC200, 4 bytes long.
     Data: <    > CD CD CD CD 
    Object dump complete.
    

    那么函数调用就是_CrtSetBreakAlloc(276);

    就个人而言,我建议您使用Visual Leak Detector,它可以让您更多地了解消息中的泄漏发生在哪里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 2011-01-09
      • 2013-04-04
      • 1970-01-01
      • 2011-08-28
      相关资源
      最近更新 更多