栈展开(stack-unwinding)
抛出异常时,将暂停当前函数的执行,开始查找匹配的catch子句。首先检查throw
本身是否在try
块内部,如果是,检查与该try
相关的catch
子句,看是否可以处理该异常。如果不能处理,就退出当前函数,并且释放当前函数的内存并销毁局部对象,继续到上层的调用函数中查找,直到找到一个可以处理该异常的catch
。这个过程称为栈展开。
有两种情况下会调用析构函数:
1.在正常情况下删除一个对象,例如对象超出了作用域或被显式地delete
2.异常传递的堆栈辗转开解(stack-unwinding)过程
中,由异常处理系统删除一个对象。
在上述两种情况下,调用析构函数时异常可能处于激活状态也可能没有处于激活状态。遗憾的是没有办法在析构函数内部区分出这两种情况。
如果在一个异常被激活的同时,析构函数也抛出异常,并导致程序控制权转移到析构函数外,C++将调用terminate
函数,它终止你程序的运行,而且是立即终止,甚至连局部对象都没有被释放。
考虑以下的类:
class Session
{
public:
Session();
~Session();
...
private:
static void logCreation</