如果在对象的构造函数中抛出异常,那么析构函数会被调用吗?或者它是不确定的行为? (这就是为什么我不愿意说我的编译器做什么。)在构造函数中抛出的异常:析构函数是否被调用?
struct foo()
{
foo(){
throw "bar";
}
~foo(){
/*am I called*/
}
};
foo f;
如果在对象的构造函数中抛出异常,那么析构函数会被调用吗?或者它是不确定的行为? (这就是为什么我不愿意说我的编译器做什么。)在构造函数中抛出的异常:析构函数是否被调用?
struct foo()
{
foo(){
throw "bar";
}
~foo(){
/*am I called*/
}
};
foo f;
析构函数将不会被调用,因为foo
对象没有被认为是完全建立,直到一个构造函数执行完毕(注意,这意味着如果你抛出一个委托给不同构造函数的构造函数,然后将调用的析构函数)。从构造函数中抛出不是未定义的行为。
对象的生命周期从其构造函数完成其执行时开始。这意味着,在构造函数执行结束之前,该对象从不存在。所以,没有活的对象,因此,没有析构函数可以调用。
因此,没有未定义的行为,除非创建异常对象引发另一个异常。在这种情况下,程序中断。但是,在异常之前完全构造的任何其他对象都会被适当地破坏,包括基本子对象,其他成员对象,在引发异常的函数的相同范围内声明的本地对象,以及之前范围的任何其他对象, t赶上那个例外。
检查出来,堆栈展开(在stackoverflow,谷歌和维基百科,按照优先顺序)。
这个答案似乎收缩quantdev的 –
@YogiBear这个答案是正确的。幸运的是,你很容易测试自己。 – Simple
我做了测试,但我从老板那里继承了“未定义行为”的紧张情绪! –