gpt4 book ai didi

c++ - 异常c++中的堆栈展开

转载 作者:行者123 更新时间:2023-11-30 03:56:44 30 4
gpt4 key购买 nike

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

我的问题:

假设异常是在 try block 中抛出的,并有合适的后续捕获,是否会为 try block 内定义的所有对象调用 d'tor?或者在异常发生之前对 try block 中定义的所有对象?或者根本没有对象,他们将“等待”函数退出?

最佳答案

语义是当控件离开 block 时,在 block 中声明的任何局部变量都应该被销毁(函数是一个命名 block ,其参数是局部变量)。因此,当您离开 try-block 时,任何本地创建的变量都将被销毁并调用其适当的 dtor。所造之物皆灭,若非所造,则不能灭。唯一没有被销毁的是异常对象本身,如果它被抛出(当然)。

来自 C++ 规范:

15.2 Constructors and destructors 1. As control passes from the point where an exception is thrown to a handler, destructors are invoked for all automatic objects constructed since the try block was entered. The automatic objects are destroyed in the reverse order of the completion of their construction

15.2 Constructors and destructors 3. The process of calling destructors for automatic objects constructed on the path from a try block to the point where an exception is thrown is called “stack unwinding.”

关于c++ - 异常c++中的堆栈展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28347336/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com