VS2010的C++内存泄露检测

2861 人浏览 | 时间: 2016-06-01 16:50:28 | 作者: wujunwei

  对于C++的内存泄露,相信大家都不陌生,因为C++的内存分配与释放是靠程序员自己控制的,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨。因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能。

  如何检测C++内存泄露,在VS2010中使用时,需加上

#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
  crtdbg.h的作用是将malloc和free函数映射到它们的调试版本_malloc_dbg和_free_dbg,这两个函数将跟踪内存分配和释放(在Debug版本中有效)_CrtDumpMemoryLeaks();函数将显示当前内存泄露,也就是说程序运行到此行代码时的内存泄露,所有未销毁的对象都会报出内存泄露,因此要让这个函数尽量放到最后。刚刚包含头文件和加宏定义是重载了malloc函数,并没有重载new操作符,所以要自己定义重载new操作符才能检测到泄露内存的申请位置。例如:


#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#ifdef _DEBUG //重载new
#define new  new(_NORMAL_BLOCK, __FILE__, __LINE__)  
#endif
#include <iostream>
using namespace std;
int main(int argc,char** argv)
{
	char *str1 = NULL;
	char *str2 = NULL;
	str1=(char*)malloc(100);
	str2=new char[50];

	_CrtDumpMemoryLeaks();
	return 0;
}
运行结果:
Detected memory leaks!
Dumping objects ->
e:\c++\test\内存泄露检测2\main.cpp(13) : {62} normal block at 0x001714F8, 50 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
e:\c++\test\内存泄露检测2\main.cpp(12) : {61} normal block at 0x00171458, 100 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete.


  如果你是调用其他文件的函数,而内存泄露是在其中的函数中出现,这是不会检测到泄露内存的申请位置,需要在有问题的文件里加上


#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#ifdef _DEBUG //重载new  
#define new  new(_NORMAL_BLOCK, __FILE__, __LINE__)    
#endif 
 如果你的文件出现#include <afxwin.h>,上面的代码添加到包含该头文件上面,会报一系列错误,这是因为new宏也在afxwin.h中定义了,导致出现冲突,所以最好是将这段代码放在所有包含头文件的下面,避免刚才的错误。


  关于内存泄露检测的更多信息,参考http://blog.csdn.net/kangroger/article/details/39317503


相关阅读