条款10:在构造函数中防止资源泄露;条款11:禁止异常信息传递到析构函数外

条款10:在构造函数中防止资源泄露:
1、构造函数中利用智能指针管理类成员变量,在构造中途发生错误时保证自动销毁变量。
参考资料:条款13-17:资源管理,std::shared_ptr

class A{
private:
	std::shared_ptr<int> pt;
public:
	A(int v1):pt(new int(v1)){
		... //若此处执行错误,导致构造对象失败,退出时,智能指针pt指向的对象将自动析构
		// 若定义为普通指针,则发生内存泄露。
	}
};

注意代码注释
类中虽然使用了动态内存,但析构函数中,不需要自动调用delete,有智能指针自动完成。

条款11:禁止异常信息传递到析构函数外:
1、析构中存在异常的例子:

class A{
private:
	void func2();
	void func2();
public:
	A();
	~A(){
		func1(); //func1()执行失败时,异常信息向外传递,导致func2()不执行。
		func2(); // 同时异常外传导致程序终止,func2()中资源泄露。
	}
};

原理: 在析构函数中,如果在一个异常发生没有捕获,析构函数会抛出异常,并导致程序控制权转移到析构函数外,C++将调用 terminate 函数。这个函数的作用:它终止你程序的运行,而且是立即终止,甚至连局部对象都没有被释放。

2、解决方法:
唯一的方法为在析构函数中假如try catch块捕获并处理异常,如:

class A{
private:
	void func2();
	void func2();
public:
	~A();
};
//.cpp
A::~A(){
	try{
		func1();  
	}
	catch(...){  } //此处可以记录执行失败日志,但记录日志仍有可能失败
	func2();
}

执行过程:析构函数在处理func1()发生异常时,catch捕获后不做任何处理,将其吸收掉;继续处理func2()
原因:这样保证了在func1();异常时继续处理func2(); 防止析构函数执行不完全;同时防止C++调用terminate终止程序。

参考资料:try throw catch笔记 与 More Effective C++ 条款11

小知识点:catch(...)表示捕获所有类型异常。

总结:

1、通过try catch块可以禁止异常信息传递到析构函数外,防止C++调用terminate终止程序;保证了析构函数执行完整。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值