C++中基于Crt的内存泄露检测
作者:网络转载 发布时间:[ 2013/3/6 13:07:08 ] 推荐标签:
下面是一些注意事项:
(1)#define _CRTDBG_MAP_ALLOC 的作用
如果不定义这个宏, C方式的malloc泄露不会被记录下来。
(2)数字{108} {107}的作用
表示第几次分配, 你可以通过_CrtSetBreakAlloc程序运行到预定次数时暂停,比如
int _tmain(int argc, _TCHAR* argv[])
{
_CrtSetBreakAlloc(108);
char* p = new char();
char* pp = new char[10];
char* ppp = (char*)malloc(10);
_CrtDumpMemoryLeaks();
return 0;
}
(3)如果程序有多个出口或是有涉及到全局变量,可以通过_CrtSetDbgFlag 设置标志让程序退出时自动打印泄露,比如
int _tmain(int argc, _TCHAR* argv[])
{
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
char* p = new char();
char* pp = new char[10];
char* ppp = (char*)malloc(10);
return 0;
}
(4)我们知道宏替代是粗暴的方式,所以尽量把下面new的替代宏放到每个Cpp里而不是放到一个通用的头文件中,实际上MFC也是这么做的
#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif
(5)上面的operator new只能照顾到普通的new,实际上operator new是有任意多种重载方式,只需要确保第一个参数是表示大小。比如下面的placement new会编译失败,因为宏替代后格式不符合要求了,所以如果你的CPP用了非标准的new,不要加入new的检测宏了。
#include <new>
#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_CLIENTBLOCK
#endif
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif
int _tmain(int argc, _TCHAR* argv[])
{
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
char* p = new char();
char* pp = new char[10];
char* ppp = (char*)malloc(10);
char d;
char* p1 = new(&d) char('a');
return 0;
}

sales@spasvo.com