检测内存泄漏
1. 检测有无内存泄漏,可以在代码后添加_CrtDumpMemoryLeaks(),也可使用_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF)在代码的任意地方
添加后再output窗口可输出泄漏信息。
#include <crtdbg.h> void leak() { int* piBuf = new int(); //delete piBuf; _CrtDumpMemoryLeaks(); } int main() { //_CrtSetBreakAlloc(73); leak(); return 0; }
如下:
Detected memory leaks!
Dumping objects ->
{73} normal block at 0x0000007EB0D444F0, 4 bytes long.
Data: < > 00 00 00 00
Object dump complete.
在VS2010以后的版本中,必须在出现泄漏代码之后添加_CrtDumpMemoryLeaks,否则无法输出内存泄漏信息,这也为查找内存泄漏提供了一种方式。而_CrtSetDbgFlag则可放在代码的任意地方。
2. 如果想知道内存泄漏在哪里,可以在代码中添加:
#ifdef _DEBUG
#define New new(_NORMAL_BLOCK, __FILE__, __LINE__)
#else
#define New new
#endif
在new的时候,使用New关键字;
#ifdef _DEBUG #define New new(_NORMAL_BLOCK, __FILE__, __LINE__) #else #define New new #endif #include <crtdbg.h> void leak() { int* piBuf = New int(); //delete piBuf; _CrtDumpMemoryLeaks(); } int main() { //_CrtSetBreakAlloc(73); leak(); return 0; }
之后再output窗口会出现如下信息:
Detected memory leaks!
Dumping objects ->
xxx\consoletest\main.cpp(11) : {73} normal block at 0x00000062033344F0, 4 bytes long.
Data: < > 00 00 00 00
Object dump complete.
清楚的指定了main.cpp的第11行出现内存泄漏。
3. 泄漏信息中{}中的数字,表示当前的new在程序中第几次new操作,可使用_CrtSetBreakAlloc(73)让程序运行到第73次内存分配时,自动停下来,进入调试状态,如此可便利的进行内存泄漏调试。
#ifdef _DEBUG #define New new(_NORMAL_BLOCK, __FILE__, __LINE__) #else #define New new #endif #include <crtdbg.h> void leak() { int* piBuf = New int(); //delete piBuf; _CrtDumpMemoryLeaks(); } int main() { _CrtSetBreakAlloc(73); leak(); return 0; }