1、在两种情况下,调用析构方法:a、在正常状态下被销毁,栈上的对象离开作用域或者堆上的对象执行delete;b、抛出异常,堆栈回滚,栈上已经构造好的对象,也就是抛出异常之前的代码,自动调用析构方法。注意:只会对已经构造好的栈上对象调用析构方法,而不会对已经初始化好的指针执行delete,因此,使用智能指针可以避免这种情况的资源泄漏。
2、考虑下面的情况,析构方法中抛出异常,在外部捕获异常。如果是正常情况下调用析构方法,没有问题。如果由于异常,堆栈回滚对栈上已经构造好的的对象调用析构方法,这个时候析构方法又抛出一个异常,导致C++调用terminate方法,结束程序。
3、析构方法抛出异常,还有另外一个问题。我们知道,析构方法往往是释放资源的,如果析构方法抛出异常,导致后面释放资源的代码还没有执行,造成资源泄漏。
4、因此,应该禁止异常流出析构方法之外,解决办法很简单,自己吞下异常。