内存泄漏检测方法
通过_CrtSetDbgFlag() 方法或者_CrtDumpMemoryLeaks()
#include <crtdbg.h>
inline void EnableMemLeakCheck()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);
}
void _tmain(int argc, _TCHAR* argv[])
{
EnableMemLeakCheck();
int *pi = new int[10];
//delete[] pi;
//_CrtDumpMemoryLeaks();
}
通过_CrtSetDbgFlag() 可以在作用域结束位置,自动调用_CrtDumpMemoryLeaks()
输出如下
看网上说定义了_CRTDBG_MAP_ALLOC如下代码段, 可以识别出哪个文件哪行代码发生的泄漏,但我没试出来。。
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
内存泄漏定位
_CrtMemState //内存状态数据类型
_CrtMemCheckpoint //获取内存状态
_CrtMemDifference //比较两个内存状态是否发生了泄漏
_CrtMemDumpStatistics //输出统计信息
void _tmain(int argc, _TCHAR* argv[])
{
EnableMemLeakCheck();//输出内存泄漏块信息,在走出作用域之前执行。
_CrtMemState s1,s2,s3;
_CrtMemCheckpoint(&s1);
int *pi = new int[10];
//delete[] pi;
_CrtMemCheckpoint(&s2);
if (_CrtMemDifference(&s3,&s1,&s2))
{
_CrtMemDumpStatistics(&s3);//输出统计信息
}
}
输出如下
如果对申请内存进行释放则,如下输出,不会有内存泄漏信息输出。
根据这种对照可以用于定位某段代码是否存在内存泄漏。
参考:
http://www.cnblogs.com/skynet/archive/2011/02/20/1959162.html#