more-effective-c++ 序列2 异常(第9节,如何利用局部对象管理资源)的测试示例

本文详细介绍了如何通过局部对象的析构函数在出现异常时自动释放资源,以确保资源安全。具体展示了auto_ptr、scoped_ptr、auto_lock、FilePtr和HandlePtr等工具的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

more effective  c++关于异常这一大节,会有一篇总体的文章(还在一点点的往下写的过程中),以比较简短的语句来描述异常这一大节的每一个小节的精髓,而整个大节会涉及很多测试,每一个测试会有一篇文章,对应着每一个小节。这一篇文章是针对第9节如何利用局部对象管理资源的。


思想:

局部对象管理资源,当中途调用出现异常的时候,利用局部对象的析构函数必须被调用的策略,在析构函数中做释放资源的操作。

一个局部对象存放[必须自动归还的资源],利用对象的析构函数归还资源。auto_ptr, scoped_ptr, auto_lock, FilePtr, HandlePtr 都是这样的思想。

这个是示例代码。

#include <iostream>
#include <time.h>
#include <memory>
using namespace std;

/*
作者:lpstudy
日期:2013-3-16
内容:more effective C++异常一章第9节,利用局部对象析构函数释放资源,保证出现异常的时候资源被安全释放。
*/
#define TRACE_FUCTION_AND_LINE(fmt, ...) printf("[%20s:%4d]"fmt"\n",__FUNCTION__, __LINE__, ##__VA_ARGS__)

//Widget仅仅是一个简单的测试类,作为auto_ptr模板的实例化参数。auto_ptr来管理new的Widget内存,并负责delete
class Widget
{
public:
	Widget(int nHight = 0): m_nHight(nHight) {TRACE_FUCTION_AND_LINE();}
	~Widget(){TRACE_FUCTION_AND_LINE();}
	void Log () {TRACE_FUCTION_AND_LINE("My Log------%d", m_nHight);}
	int m_nHight;
};

//FilePtr接收一个FILE handle,并负责在对象析构的时候关闭handle。
class FilePtr
{
public:
	explicit FilePtr(FILE* f = NULL):m_hFile(f)
	{
		TRACE_FUCTION_AND_LINE("m_hFile:%08p", m_hFile);
	}
	~FilePtr() 
	{
		if (m_hFile) 
		{
			TRACE_FUCTION_AND_LINE("close m_hFile:%08p", m_hFile);
			fclose(m_hFile); 
		}
	}
	FILE* Get() {return m_hFile;}
private:
	FILE* m_hFile;
};


int main()
{
	TRACE_FUCTION_AND_LINE("Trace auto_ptr.......");
	auto_ptr<Widget> autoWight(new Widget(100));
	autoWight->Log();

	TRACE_FUCTION_AND_LINE("Trace FilePtr.......");
	FilePtr filePtr(fopen("data.txt", "a+"));
	char buf[100] = "Data Test ...\n";
	fwrite(buf, 1, strlen(buf), filePtr.Get());
	return 0;
}

希望还没有获取这种思想,或者知道这种思想但还没有完全领悟的,仔细看看这个简单的例子。

如果想更深入的理解关于auto_ptr以及lock的一些东西,建议看看前面我博客前面介绍的scoped_ptr以及autolock的一些东西。

请相信我,这个非常有价值。google代码大片使用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值