CRT检测

定位内存泄漏位置

#include "stdafx.h"
#ifdef _DEBUG

#define DEBUG_NEW new( _NORMAL_BLOCK, __FILE__, __LINE__) //重新定义new用于内存泄漏检测时输出行号
#define DEBUG_MALLOC(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)//重新定义malloc用于内存泄漏检测时输出行号
#else
#define DEBUG_NEW
#define DEBUG_MALLOC(s)
#endif
//这句定义不起作用,真神奇,不解,这句本身的作用也是定义#define DEBUG_MALLOC(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__),既然不起作用就自己重新定义了
//#define _CRTDBG_MAP_ALLOC
#include "crtdbg.h"//这个要在DEBUG_NEW 和 DEBUG_MALLOC(s)后面调用,否则不起作用

#include <iostream>
using namespace std;

#ifdef _DEBUG
#define new DEBUG_NEW
#define malloc(s) DEBUG_MALLOC(s)
#endif


int _tmain(int argc, _TCHAR* argv[])
{
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );//在程序退出后检查内存泄漏(程序可能会在多个位置退出,这句适用与在各种情况的退出)
char *p1=new char;
char *p2 = (char*)malloc(sizeof(char) * 5);
//_CrtDumpMemoryLeaks();//检测当前内存泄漏,一般写在程序退出之前,但如果析构函数中有delete,本来已经正常释放的内存还会被查出内存泄漏,因为这个函数检查的是当前位置的内存泄漏

return 0;

}


结果

C++内存泄漏检测_#ifdef


定位调用(内存泄漏函数)位置

设置内存状态快照,用于程序代码分段寻找内存泄漏位置。

#include "stdafx.h"
#ifdef _DEBUG
//重新定义new用于内存泄漏检测时输出行号
#define DEBUG_NEW new( _NORMAL_BLOCK, __FILE__, __LINE__)
//重新定义malloc用于内存泄漏检测时输出行号
#define DEBUG_MALLOC(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_NEW
#define DEBUG_MALLOC(s)
#endif
//这句定义不起作用,真神奇,不解,这句本身的作用也是定义#define DEBUG_MALLOC(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__),既然不起作用就自己重新定义了
//#define _CRTDBG_MAP_ALLOC

//这个要在DEBUG_NEW 和 DEBUG_MALLOC(s)后面调用,否则不起作用
#include "crtdbg.h"

#include <iostream>
using namespace std;

#ifdef _DEBUG
#define new DEBUG_NEW
#define malloc(s) DEBUG_MALLOC(s)
#endif

_CrtMemState s1, s2, s3;

void mleak()
{
int * p3 = new int;
}

int _tmain(int argc, _TCHAR* argv[])
{
//在程序退出后检查内存泄漏(程序可能会在多个位置退出,这句适用与在各种情况的退出)
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
char *p1=new char;
char *p2 = (char*)malloc(sizeof(char) * 5);


_CrtMemCheckpoint( &s1 );
mleak();
_CrtMemCheckpoint( &s2 );

if ( _CrtMemDifference( &s3, &s1, &s2) )
_CrtMemDumpStatistics( &s3 );

//检测当前内存泄漏,一般写在程序退出之前,但如果析构函数中有delete,本来已经正常释放的内存还会被查出内存泄漏,因为这个函数检查的是当前位置的内存泄漏
//_CrtDumpMemoryLeaks();
return 0;

}



C++内存泄漏检测_程序退出_02