C++ 函数中的异常为构造函数返回值

C++ 函数中的异常为构造函数返回值,c++,exception,constructor,smart-pointers,raii,C++,Exception,Constructor,Smart Pointers,Raii,假设我有一个充当“智能指针”的类,在销毁时释放某种系统资源 class Resource{ protected: ResourceHandle h; public: Resource(ResourceHandle handle) :h(handle){ } ~Resource(){ if (h) releaseResourceHandle(h);//external function, probabl

假设我有一个充当“智能指针”的类,在销毁时释放某种系统资源

class Resource{
protected:
     ResourceHandle h;
public:
     Resource(ResourceHandle handle)
     :h(handle){
     }

     ~Resource(){
         if (h)
             releaseResourceHandle(h);//external function, probably from OS
     }
};
我有一个函数,返回用于初始化“资源”的值:

现在,如果我在代码中这样做:

Resource resource(allocateHandle());
而allocateHandle()抛出一个异常,具体会发生什么?崩溃会发生在资源()的构造期间还是在构造之前


常识告诉我,因为异常是在allocateHandle返回之前抛出的,所以执行过程甚至不会进入Resource()构造函数,但我对此不太确定。这是一个正确的假设吗?

这是一个正确的假设。

参数在任何函数调用之前进行求值,在本例中,构造函数--。
因此,在构造函数调用之前抛出异常

是的,您的假设是正确的

此时,您只需创建参数并将其推送到堆栈上。“资源”的对象还没有形成


因此,在堆栈展开期间,异常不会调用析构函数。

如果编译器输入了构造函数,它可以从没有返回的函数中传递什么值?

是的,您是正确的(正如其他人所说)

但你指的是什么(我想)。
如果输入构造函数并引发异常,对象会发生什么情况

析构函数还会被执行吗

只有在构造函数实际完成时才会触发析构函数(如果抛出异常并逃逸构造函数,则构造函数未完成)。在这种情况下,不会输入构造函数,因此对象不存在,因此不会执行析构函数

如果在构造函数执行时引发异常,会发生什么情况。
在这种情况下,由于构造函数未完成,析构函数也将永远不会执行,但所有成员字段又如何呢?如果构造函数通过异常保留,则所有完全格式的成员都将调用其析构函数(完全格式的成员是其构造函数已被调用并成功完成的成员)

Resource resource(allocateHandle());