我已将以下内容添加到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
答案 0 :(得分:7)
int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
flag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag(flag);
这足以启用内存泄漏检测。请勿直接致电_CrtSetDbgFlag
。
但是,为了获得源代码行,调用泄漏分配,您需要做更多的事情。
在所有#include行之后立即将这些行添加到每个.cpp文件的开头:
#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.
答案 1 :(得分:3)
http://msdn.microsoft.com/en-us/library/4wth1ha5.aspx
首先,我认为你在这里发布的这些代码集需要排在主函数体的第一行,但我不确定。
据我所知,_CrtSetBreakAlloc函数会在应用程序尝试分配作为参数传递的位置时让Debugger中断。
当调试器将内存泄漏转储到输出窗口时,您是否获得了内存的位置? 您将不得不复制该位置并在下次运行时将其用作_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,这将为您提供有关消息泄漏发生位置的更多线索。