构造函数返回值的异常
问题描述:
比方说,我有一个充当“智能指针”的类,并在销毁时释放某种系统资源。构造函数返回值的异常
class Resource{
protected:
ResourceHandle h;
public:
Resource(ResourceHandle handle)
:h(handle){
}
~Resource(){
if (h)
releaseResourceHandle(h);//external function, probably from OS
}
};
而且我有一些函数返回用于 “资源” 的初始值:
ResourceHandle allocateHandle();
现在,如果我这样做在我的代码:
Resource resource(allocateHandle());
和allocateHandle( )抛出异常,究竟会发生什么?在Resource()的施工期间或施工前会发生事故吗?
常识告诉我,因为在allocateHandle返回之前抛出异常,所以执行甚至不会输入Resource()构造函数,但我并不完全确定它。这是一个正确的假设吗?
答
在任何函数调用之前评估参数 - 在本例中为构造函数 - 。 因此,在构造函数调用之前抛出异常
答
这是一个正确的假设。
答
是的,您的假设是正确的。
此时您只创建参数并将它们推入堆栈。 “资源”的对象甚至没有形成!
因此,在堆栈展开期间,异常不会调用析构函数。
答
如果编译器进入构造函数,它会从没有返回的函数传入什么值?
答
是的,你是正确的(正如其他人所说的)。
但你在暗指(我认为)。
如果输入构造函数并抛出异常,对象会发生什么。
析构函数仍然会执行吗?
如果构造函数实际完成(如果异常是抛出构造函数然后构造函数未完成的throw),则只会触发析构函数。在这种情况下,构造函数不会被输入,因此对象不存在,因此析构函数将不会被执行。
如果在构造函数执行时抛出异常,会发生什么情况。
在这种情况下,因为构造函数没有完成,析构函数也不会执行,但是所有成员字段呢?如果通过异常离开构造函数,则所有完全形成的成员将调用它们的析构函数(完全形成的成员是构造函数已被调用并成功完成的成员)。