简介本文介绍C++内存泄漏的检测与定位方法,感兴趣的朋友可以参考一下。

MFC程序

如果检测到存在内存泄漏,退出程序的时候会在调试窗口提醒内存泄漏。

因为VS自动在cpp文件中添加了如下代码:

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

对于语句:int *p = new int[10]; 不释放产生的内存泄漏报告大体如下:

Detected memory leaks!
Dumping objects ->
e:\qt\ts man\mfcleak\mfcleakdlg.cpp(55) : {313} normal block at 0x004F9DF0, 40 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete.

双击“输出”窗口中,内存泄漏报告的文字”e:\qt\ts man\mfcleak\mfcleakdlg.cpp(55) : {313} normal block at 0x004F9DF0, 40 bytes long.”,或者在Debug窗口中逻辑按F4(VS2015),IDE就帮你定位到引起内存泄漏的对应文件的对应行,也就是这一句:

int* p= new int[10];

非MFC程序

对应非MFC需要加入如下若干语句

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define NEW_WITH_MEMORY_LEAK_CHECKING new(_NORMAL_BLOCK,__FILE__,__LINE__)
#define new NEW_WITH_MEMORY_LEAK_CHECKING

int main()
{
	auto p = new int[10];
	//delete[] p;

	_CrtDumpMemoryLeaks();
	getchar();
	return 0;
}

内存泄漏报告大体如下:

Detected memory leaks!
Dumping objects ->
c:\users\administrator\desktop\win32projecttemplate\win32projecttemplate\win32projecttemplate.cpp(14) : {71} normal block at 0x011904D0, 40 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete.

这样调试方法就和MFC程序一样了。

还可以这样实现:

// 使用调试库
#define _CRTDBG_MAP_ALLOC
#include 
#include 
// 重定义new运算符
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new (_NORMAL_BLOCK,__FILE__,__LINE__)
#define new DBG_NEW
#endif
#endif

int _tmain(int argc, _TCHAR* argv[])
{
	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

	auto p = new int[10];
	//delete[] p;

	system("pause");
	return 0;
}

更多为你推荐