您的位置:首页 > 编程语言 > C语言/C++

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

2014-03-30 19:25 148 查看
#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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: