#define _CRTDBG_MAP_ALLOC #ifdef _DEBUG #define new new( _CLIENT_BLOCK, __FILE__, #endif #include <stdlib.h> #include <crtdbg.h> int main() { int* p = new int(); _CrtDumpMemoryLeaks(); return 0; }
可以【定位】出内存泄露的代码在哪一行!
output信息如下:
‘Test.exe‘: Loaded ‘E:\CODE\Test\Debug\Test.exe‘, Symbols
loaded.
‘Test.exe‘: Loaded ‘C:\Windows\System32\ntdll.dll‘, Cannot find or
open the PDB file
‘Test.exe‘: Loaded ‘C:\Windows\System32\kernel32.dll‘,
Cannot find or open the PDB file
‘Test.exe‘: Loaded
‘C:\Windows\System32\KernelBase.dll‘, Cannot find or open the PDB
file
‘Test.exe‘: Loaded ‘C:\Windows\System32\msvcr100d.dll‘, Symbols
loaded.
Detected memory leaks!
Dumping objects
->
e:\code\test\test\main.cpp(15) : {50} client block at 0x003813B0,
subtype 0, 4 bytes long.
Data: < > 00 00
00 00
Object dump complete.
The program ‘[6176] Test.exe: Native‘ has
exited with code 0 (0x0).
output信息中就提示了main中第15行有内存泄露,双击也可以定位到该行。
如果程序只有一个出口,那么调用 _CrtDumpMemoryLeaks 的位置是很容易选择的。但是,如果程序可能会在多个地方退出该怎么办呢?在每一个可能的出口处调用 _CrtDumpMemoryLeaks 肯定是不可取的,那么这时可以在程序开始处包含下面的调用:
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
这条语句无论程序在什么地方退出都会自动调用 _CrtDumpMemoryLeaks。注意:这里必须同时设置两个位域标志:_CRTDBG_ALLOC_MEM_DF 和 _CRTDBG_LEAK_CHECK_DF。