任何人都可以解释为什么以下代码段的输出是:
MyClass constructor catch block
为什么没有调用对象m
的析构函数,因为它的范围在try块内?
当使用throw 0;
语句捕获块时,m
的对象MyClass
超出了范围,并且应该正确调用它的析构函数?
我错过了某种概念吗?
class MyClass {
public:
MyClass() {
std::cout << "\nMyClass constructor" ;
throw 0;
}
~MyClass() {
std::cout << "\nMyClass destructor" << std::endl;
}
};
int main(void)
{
try {
MyClass m;
} catch(int e) {
std::cout << "\ncatch block" << std::endl;
}
return 0;
}
答案 0 :(得分:1)
UKMonkey
是对的。看他的评论。
当您在构造函数中引发异常时,它无法实例化对象m。因为没有对象存在所以没有调用析构函数。这就是我们在从构造函数中抛出异常时必须非常小心的原因。只需注释掉throw 0;
并进行检查即可。你会明白的。