2015-02-05 123 views
0

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

我的问题:

假设异常与合适的下一个捕捉try块内抛出, 将D'TOR将呼吁try块中定义的所有对象? 或在try块中定义的所有对象,直到发生异常?或根本没有任何对象,他们将“等待”该功能退出?

回答

2

语义是当控件离开块(一个函数是一个带参数是局部变量的命名块)时,块中声明的任何局部变量应该被销毁。所以当你离开一个try-block时,任何本地创建的变量将被销毁,并且它的适当的dtor被调用。所有创建的东西都会被销毁,如果没有创建它,它就不能被销毁。唯一没有被销毁的是objet本身的异常(当然)。

从C++规范:

15.2构造和析构1.作为控制从那里则抛出异常给 处理程序的点通过,析构函数被调用的所有自动对象构造 由于尝试块被输入。自动对象在它们的结构

15.2的构造的完成和析构函数的相反顺序3.要求自动对象析构函数的过程的路径上构成 从try块的点被破坏 其中一个异常被抛出 被称为“堆栈展开”。