内存泄露检测

#include <iostream>
#include <crtdbg.h>

#ifdef _DEBUG
#define DEBUG_NEW new (_NORMAL_BLOCK, THIS_FILE, __LINE__)
#endif

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#ifdef _DEBUG
#ifndef ASSERT
#define ASSERT  assert
#endif
#else   // not _DEBUG
#ifndef ASSERT
#define ASSERT
#endif
#endif  // _DEBUG


/** @函数 main */
int main( int argc, char** argv )
{
#ifdef _DEBUG
    	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
#endif

	int* pI=new int[10];

	return 0;
}

上述代码看起来是不是很熟悉?呵,其实就是MFC框架的内存泄露检测框架代码。在Debug模式下,使用_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF)开启内存泄露检测。前面的一些宏定义是为了将内存泄露的文件名和行号输出来,还有就是开启ASSERT宏。这样代码看起来挺难看的,你要是有洁癖,可以选择不加这些宏定义,但是内存泄漏时,可不会告诉你泄露的位置。
编译运行上述代码,看看效果如何。

程序退出时候,输出窗口打印出内存泄露的文件main和行号135,泄露字节40bytes。内容是CD CD ···(其实CD翻译成汉语就是程序员常见的乱码”屯“,即VC在Debug模式下将未初始化的变量统一赋值为CD)。

那么如何管理资源,防止内存泄露呢?可以使用C++智能指针auto_ptr还有引用计数型智能指针tr1::shared_ptr。但是最好是用这些指针去管理对象,而不是去管理数组(例如int数组,否则可能会有麻烦的)。

#include <iostream>
#include <crtdbg.h>

#ifdef _DEBUG
#define DEBUG_NEW new (_NORMAL_BLOCK, THIS_FILE, __LINE__)
#endif

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#ifdef _DEBUG
#ifndef ASSERT
#define ASSERT  assert
#endif
#else   // not _DEBUG
#ifndef ASSERT
#define ASSERT
#endif
#endif  // _DEBUG


/** @函数 main */
int main( int argc, char** argv )
{
	#ifdef _DEBUG
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
	#endif
	std::string newDog("Persephone");
	std::string oldDog("Satch");

	int* pI=new int;
	std::tr1::shared_ptr<int> p(pI);
	
	return 0;

}

上述代码,我只是用了pI分配了4个字节(int大小)。之后用tr1::shared_ptr指针去管理这个资源。在程序结束时,p自动调用析构函数,在析构函数里面释放掉这个资源。

更多内容,可以参考: [美]Scott Meyers《Effective C++》,老罗的数据结构与算法分析 学习笔记


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值