构造函数中抛出的异常:被调用析构函数

Exception thrown in a constructor: is the destructor called?

本文关键字:调用 析构函数 异常 构造函数      更新时间:2023-10-16

如果在对象的构造函数中抛出异常,那么会调用析构函数吗?或者是未定义的行为?(这就是为什么我不愿意说我的编译器是做什么的。)

struct foo()
{
    foo(){
        throw "bar";
    }
    ~foo(){
        /*am I called*/
    }
};
foo f;

析构函数将不会被调用,因为在构造函数完成执行之前,foo对象不会被认为是完全构造的(注意,这意味着如果您抛出一个委托给不同构造函数的构造函数,则析构函数将被调用)。从构造函数抛出不是未定义行为。

对象的生命周期从其构造函数完成执行时开始。这意味着,在构造函数执行结束之前,对象从未存在过。因此,没有活动对象,也就没有可调用的析构函数。

因此,没有未定义的行为,除非异常对象的创建抛出另一个异常。在这种情况下,程序立即终止。

但是,在异常之前完全构造的任何其他对象都被适当地析构,包括基子对象、其他成员对象、在抛出异常的函数的同一作用域中声明的局部对象,以及在先前作用域中未捕获该异常的任何其他对象。

查看堆栈展开(在stackoverflow, google和wikipedia上,按优先顺序排列)