构造函数中抛出的异常:被调用析构函数
Exception thrown in a constructor: is the destructor called?
如果在对象的构造函数中抛出异常,那么会调用析构函数吗?或者是未定义的行为?(这就是为什么我不愿意说我的编译器是做什么的。)
struct foo()
{
foo(){
throw "bar";
}
~foo(){
/*am I called*/
}
};
foo f;
析构函数将不会被调用,因为在构造函数完成执行之前,foo
对象不会被认为是完全构造的(注意,这意味着如果您抛出一个委托给不同构造函数的构造函数,则析构函数将被调用)。从构造函数抛出不是未定义行为。
对象的生命周期从其构造函数完成执行时开始。这意味着,在构造函数执行结束之前,对象从未存在过。因此,没有活动对象,也就没有可调用的析构函数。
因此,没有未定义的行为,除非异常对象的创建抛出另一个异常。在这种情况下,程序立即终止。但是,在异常之前完全构造的任何其他对象都被适当地析构,包括基子对象、其他成员对象、在抛出异常的函数的同一作用域中声明的局部对象,以及在先前作用域中未捕获该异常的任何其他对象。
查看堆栈展开(在stackoverflow, google和wikipedia上,按优先顺序排列)
相关文章:
- 什么时候调用析构函数
- C++-明确何时以及如何调用析构函数
- C++ 防止在映射中放置()时调用析构函数
- 调用析构函数以释放动态分配的内存
- C++:使用方法调用析构函数的顺序是什么?
- 向量推回调用析构函数时调用析构函数
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- C++,我应该调用析构函数吗?
- 如何获取有关在 Clang LibTooling 中调用析构函数的信息?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 为什么这里不调用析构函数
- 在调用 std::bind 的产品后意外调用析构函数
- 为什么在传递给函数而不是构造函数时调用析构函数?
- 如何在C++中调用析构函数
- 为什么为未删除的对象调用析构函数?
- 调用析构函数时出错
- C++ 在不释放内存的情况下调用析构函数
- 为什么在运算符删除中不调用析构函数?
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 在 postOrderDelete 上调用析构函数时引发的异常