堆栈在异常c ++中展开

时间:2015-02-05 15:06:07

标签: c++ exception try-catch stack-unwinding

我开始学习C ++中的异常主题。 我遇到了术语"堆栈展开"这意味着,据我的理解, 抛出异常时,"投掷函数"内部没有catch块,函数堆栈将"展开",并由此所有本地对象的d' ; tor将被调用(在外部函数中也会发生同样的情况,直到遇到合适的catch块)。

我的问题:

假设异常是在try块中抛出的,并且有适当的后续catch, 是否会为try块内定义的所有对象调用d?tor? 或者在try块中定义的所有对象,直到发生异常?或根本没有任何对象,他们将等待"要退出的功能?

1 个答案:

答案 0 :(得分:2)

语义是当控件离开块时,应该销毁块中声明的任何局部变量(函数是一个带有局部变量参数的命名块)。因此,当您离开try-block时,任何本地创建的变量都将被销毁并调用其相应的dtor。创建的所有内容都会被破坏,如果没有创建,它就不会被破坏。唯一没有被破坏的是异常objet本身,如果它被抛出(当然)。

来自C ++规范:

  

15.2构造函数和析构函数1. 当控件从抛出异常的位置传递到   处理程序,为所有构造的自动对象调用析构函数   因为输入了try块。自动对象被破坏   按照完工建设的相反顺序

     

15.2构造函数和析构函数3. 为构造的自动对象调用析构函数的过程   在从try块到抛出异常的路径上   被称为“堆栈展开。”