使用异常的 C++ 代码得把所有涉及到打开/关闭、获取/释放此类操作的代码都用 class 封装起来(所谓 RAII),在实际工程开发中挺麻烦。
而且,RAII 鼓励在构造函数中完成完整的初始化(与之相对的做法是在构造函数里基本不做什么事,真正的初始化由一个单独的 Init 函数来执行),这样就避免不了构造函数抛异常。
然而,只要允许了构造函数抛异常,那写代码就需要更小心了。举个例子,请问下面代码中,分别在以下几种情况下:
* 构造 b_ 时抛了异常
* 构造 c_ 时抛了异常
* (1) 处抛了异常
* (2) 处抛了异常
~A() 会执行吗?c_ 的析构函数会执行吗?b_ 的析构函数会执行吗?
class A {
public:
A() : b_(), c_() { /* ... */ }
A(int x) : b_(), c_() { /* (1) */ }
A(float x) : A() { /* (2) */ }
~A() { /* ... */ }
private:
B b_;
C c_;
}
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 异常安全有什么坑吗?
: 不是抛出 Exception,接收的时候用 Exception & 就行了吗?
--
修改:vonNeumann FROM 183.60.88.*
FROM 183.60.88.*