VC++使用用crtdbg定位内存泄露错误

#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。

VC++使用用crtdbg定位内存泄露错误,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。