我开始学习 C++ 中的异常主题。我遇到了术语“堆栈展开”,据我了解,这意味着每当抛出异常,并且“抛出函数”内部没有 catch 块时,函数堆栈将“展开”,因此所有本地对象的 d' tor 将被调用(在外部函数中也会发生同样的情况,直到遇到合适的 catch 块)。
我的问题:
假设异常是在带有合适的后续捕获的 try 块内引发的,是否将为 try 块内定义的所有对象调用 d'tor?还是对 try 块中定义的所有对象,直到发生异常?或者根本没有对象,他们会“等待”函数退出?
我开始学习 C++ 中的异常主题。我遇到了术语“堆栈展开”,据我了解,这意味着每当抛出异常,并且“抛出函数”内部没有 catch 块时,函数堆栈将“展开”,因此所有本地对象的 d' tor 将被调用(在外部函数中也会发生同样的情况,直到遇到合适的 catch 块)。
我的问题:
假设异常是在带有合适的后续捕获的 try 块内引发的,是否将为 try 块内定义的所有对象调用 d'tor?还是对 try 块中定义的所有对象,直到发生异常?或者根本没有对象,他们会“等待”函数退出?
语义是当控件离开块时,在块中声明的任何局部变量都应该被销毁(函数是带有局部变量参数的命名块)。因此,当您离开 try-block 时,任何本地创建的变量都将被销毁并调用相应的 dtor。被创造的一切都会被摧毁,如果没有创造出的东西,它根本就无法被摧毁。唯一没有被破坏的是异常对象本身,如果它被抛出(当然)。
来自 C++ 规范:
15.2 构造函数和析构函数 1.当控制从抛出异常的点传递到处理程序时,析构函数被调用用于自进入 try 块以来构造的所有自动对象。自动对象按照其构建完成的相反顺序被销毁
15.2 构造函数和析构函数 3.为自动对象调用析构函数的过程被称为“堆栈展开”。</p>