C++ 构造函数中引发异常:是否调用析构函数?

C++ 构造函数中引发异常:是否调用析构函数?,c++,C++,如果在对象的构造函数中抛出异常,那么会调用析构函数吗?还是不明确的行为?(这就是为什么我不愿意说我的编译器是做什么的。) 不会调用析构函数,因为在构造函数完成执行之前,foo对象不会被认为是完全构造的(请注意,这意味着如果您插入一个委托给其他构造函数的构造函数,则将调用析构函数)。从构造函数抛出不是未定义的行为。对象的生存期从其构造函数完成其执行时开始。这意味着,在构造函数执行结束之前,对象根本不存在。因此,没有活动对象,因此,没有可调用的析构函数 因此,没有未定义的行为,除非异常对象的创建引发

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


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

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

因此,没有未定义的行为,除非异常对象的创建引发另一个异常。在这种情况下,程序会中途中止

但是,在异常发生之前完全构造的任何其他对象都会被适当地分解,包括基本子对象、其他成员对象、在引发异常的函数的同一作用域中声明的本地对象,以及以前作用域中未捕获该异常的任何其他对象


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

这个答案似乎缩小了quantdev的定义s@YogiBear这个答案是正确的。幸运的是,这对你来说很容易测试你自己。我确实测试了它,但我从老板那里继承了“未定义的行为”的紧张@瑜伽熊:这是一种非常明确的行为。虽然quantdev给出了错误的答案,但他给出了正确的链接。没有UB,也没有内存泄漏。(好,不是FAQ状态,因为 AutoPyTrp/Cuff>在C++ 11中被禁止。但是其他任何一个都会做得很好。如果你需要在C++版本上移植,那么如果你需要析构函数来调用一些资源,那么你应该让数据成员持有一个智能指针/一些其他RAII对象。如果未调用foo,则将调用数据成员的析构函数,因为该数据成员已完全构造。
struct foo()
{
    foo(){
        throw "bar";
    }
    ~foo(){
        /*am I called*/
    }
};

foo f;