如何找到内存泄漏的位置?

0 c++ memory-leaks visual-c++

我已经将以下内容添加到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
Run Code Online (Sandbox Code Playgroud)

Ale*_*x F 7

int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
flag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag(flag);
Run Code Online (Sandbox Code Playgroud)

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

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

#ifdef _DEBUG
#define new DEBUG_NEW
#endif
Run Code Online (Sandbox Code Playgroud)

对于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
Run Code Online (Sandbox Code Playgroud)

将其包含在每个.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.
Run Code Online (Sandbox Code Playgroud)