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;
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11