Effective C++ Item 29 为”异常安全”而努力是值得的

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie


经验:异常安全函数即使发生异常也不会泄漏资源或允许任何数据结构败坏。这样的函数区分为三种

可能的保证:
基本型-->发生异常,程序处于某个合法状态
强烈型-->发生异常,程序处于原先状态
不抛异常型-->承诺绝不抛出殿堂


示例:
class PrettyMenu{
public:
	//...
	void changeBackground(std::istream &imgSrc); //改变背景图像
	//...
private:
	Mutex mutex;     //互斥器
	Image *bgImage;  //目前的背景图像
	int imageChanges;//背景图像被改变的次数
};


void PrettyMenu::changeBackground(std::istream &imgSrc){
	lock(&mutex);
	delte bgImage;
	++imageChanges;
	bgImage = new Image(imgSrc);
	unlock(&mutex);
}

解析:
泄漏资源:new Image(imgSrc) 导致异常的话,互斥器就不会 unlock
数据败坏:new Image(imgSrc) 导致异常的话,bgImage指向一个已删除的对象,imageChanges 也已被累加

纠正:
class PrettyMenu{
	//...
	std::tr1::shared_ptr<Image> bgImage; //以对象管理资源
	//...
};


void PrettyMenu::changeBackground(std::istream &imgSrc){
	Lock ml(&mutex); // 以对象管理资源
	bgImage.reset(new Image(imgSrc)); // 以"new Image" 的执行结果设定 bgImage 内部指针
	++imageChanges;
}

解析:
delte 只有 reset 函数内被使用, 而 shared_ptr::reset 函数只有在其参数被成功生成之后才会被调用。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值