1. 具体使用的方法
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#define _CRTDBG_MAP_ALLOC_NEW
#include <crtdbg.h>
#endif
定义以上的宏来检测内存泄漏。
2. 具体的例子
(1)先定义几个new或者malloc的代码而没有delete与free,如下#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#define _CRTDBG_MAP_ALLOC_NEW
#include <crtdbg.h>
#endif // _DEBUG
int main()
{
//开始运行时先注释_,检测到编号后再加上.数字使用检测到的编号替代
//_CrtSetBreakAlloc(83);
int* pi = new int();
char* pc = new char[10];
char* pcc = (char*)malloc(10);
_CrtDumpMemoryLeaks();
return 0;
}
程序运行结果如下:
(2)图中检测到3出数字内存泄漏的地方,选择83这个地方定位到泄漏的地方,代码如下:
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#define _CRTDBG_MAP_ALLOC_NEW
#include <crtdbg.h>
#endif // _DEBUG
int main()
{
//开始运行时先注释_,检测到编号后再加上.数字使用检测到的编号替代
_CrtSetBreakAlloc(83);
int* pi = new int();
char* pc = new char[10];
char* pcc = (char*)malloc(10);
_CrtDumpMemoryLeaks();
return 0;
}
打开
_CrtSetBreakAlloc
程序运行如下:
(3)定位到这一句内存泄漏,我们使用free解决内存泄漏,代码如下:
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#define _CRTDBG_MAP_ALLOC_NEW
#include <crtdbg.h>
#endif // _DEBUG
int main()
{
//开始运行时先注释_,检测到编号后再加上.数字使用检测到的编号替代
//_CrtSetBreakAlloc(83);
int* pi = new int();
char* pc = new char[10];
char* pcc = (char*)malloc(10);
free(pcc);
_CrtDumpMemoryLeaks();
return 0;
}
并再次注释_CrtSetBreakAlloc,再找其他泄漏的地方,运行如下:
图中看出还有82,81处,按照前边的2步依次进行则可以解决。
(4)当运行如下代码全部内存泄漏都解决后,再没有泄漏的地方。
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#define _CRTDBG_MAP_ALLOC_NEW
#include <crtdbg.h>
#endif // _DEBUG
int main()
{
//开始运行时先注释_,检测到编号后再加上.数字使用检测到的编号替代
//_CrtSetBreakAlloc(83);
int* pi = new int();
char* pc = new char[10];
char* pcc = (char*)malloc(10);
free(pcc);
delete[] pc;
delete pi;
_CrtDumpMemoryLeaks();
return 0;
}