构造函数返回值的异常

问题描述:

比方说,我有一个充当“智能指针”的类,并在销毁时释放某种系统资源。构造函数返回值的异常

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),则只会触发析构函数。在这种情况下,构造函数不会被输入,因此对象不存在,因此析构函数将不会被执行。

如果在构造函数执行时抛出异常,会发生什么情况。
在这种情况下,因为构造函数没有完成,析构函数也不会执行,但是所有成员字段呢?如果通过异常离开构造函数,则所有完全形成的成员将调用它们的析构函数(完全形成的成员是构造函数已被调用并成功完成的成员)。