【问题标题】:stack unwinding in exception c++异常c ++中的堆栈展开
【发布时间】:2015-02-05 15:06:06
【问题描述】:

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

我的问题:

假设异常是在一个 try 块内引发的,并带有适当的后续 catch, 将为 try 块内定义的所有对象调用 d'tor 吗? 还是到 try 块中定义的所有对象,直到发生异常?或者根本没有对象,他们会“等待”函数退出?

【问题讨论】:

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


    【解决方案1】:

    语义是当控件离开块时,在块中声明的任何局部变量都应该被销毁(函数是带有局部变量参数的命名块)。因此,当您离开 try-block 时,任何本地创建的变量都将被销毁并调用相应的 dtor。被创造的一切都会被摧毁,如果没有创造出的东西,它根本就无法被摧毁。唯一没有被销毁的是异常对象本身,如果它被抛出(当然)。

    来自 C++ 规范:

    15.2 构造函数和析构函数 1. 当控制从抛出异常的点传递到 处理程序,为所有构造的自动对象调用析构函数 因为进入了try块。自动对象被销毁 以他们建造完成的相反顺序

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 2017-02-19
      • 1970-01-01
      • 2014-04-17
      • 2017-08-06
      • 1970-01-01
      相关资源
      最近更新 更多