为什么在从构造函数中抛出异常时不调用对象的析构函数?

时间:2017-11-27 10:15:11

标签: c++ c++11 constructor try-catch

任何人都可以解释为什么以下代码段的输出是:

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;                                                                   
}    

1 个答案:

答案 0 :(得分:1)

UKMonkey是对的。看他的评论。 当您在构造函数中引发异常时,它无法实例化对象m。因为没有对象存在所以没有调用析构函数。这就是我们在从构造函数中抛出异常时必须非常小心的原因。只需注释掉throw 0;并进行检查即可。你会明白的。