C++ 构造函数中引发异常:是否调用析构函数?
如果在对象的构造函数中抛出异常,那么会调用析构函数吗?还是不明确的行为?(这就是为什么我不愿意说我的编译器是做什么的。)C++ 构造函数中引发异常:是否调用析构函数?,c++,C++,如果在对象的构造函数中抛出异常,那么会调用析构函数吗?还是不明确的行为?(这就是为什么我不愿意说我的编译器是做什么的。) 不会调用析构函数,因为在构造函数完成执行之前,foo对象不会被认为是完全构造的(请注意,这意味着如果您插入一个委托给其他构造函数的构造函数,则将调用析构函数)。从构造函数抛出不是未定义的行为。对象的生存期从其构造函数完成其执行时开始。这意味着,在构造函数执行结束之前,对象根本不存在。因此,没有活动对象,因此,没有可调用的析构函数 因此,没有未定义的行为,除非异常对象的创建引发
不会调用析构函数,因为在构造函数完成执行之前,
foo
对象不会被认为是完全构造的(请注意,这意味着如果您插入一个委托给其他构造函数的构造函数,则将调用析构函数)。从构造函数抛出不是未定义的行为。对象的生存期从其构造函数完成其执行时开始。这意味着,在构造函数执行结束之前,对象根本不存在。因此,没有活动对象,因此,没有可调用的析构函数
因此,没有未定义的行为,除非异常对象的创建引发另一个异常。在这种情况下,程序会中途中止
但是,在异常发生之前完全构造的任何其他对象都会被适当地分解,包括基本子对象、其他成员对象、在引发异常的函数的同一作用域中声明的本地对象,以及以前作用域中未捕获该异常的任何其他对象
查看它,堆栈展开(在stackoverflow、google和wikipedia上,按优先顺序排列)。这个答案似乎缩小了quantdev的定义s@YogiBear这个答案是正确的。幸运的是,这对你来说很容易测试你自己。我确实测试了它,但我从老板那里继承了“未定义的行为”的紧张@瑜伽熊:这是一种非常明确的行为。虽然quantdev给出了错误的答案,但他给出了正确的链接。没有UB,也没有内存泄漏。(好,不是FAQ状态,因为
struct foo()
{
foo(){
throw "bar";
}
~foo(){
/*am I called*/
}
};
foo f;