异常c++中的堆栈展开
stack unwinding in exception c++
我开始学习C++中的异常主题。我遇到了术语"堆栈展开",在我看来,这意味着,只要抛出异常,并且"抛出函数"内部没有catch块,函数堆栈就会"展开",从而调用所有本地对象的d’tor(同样的情况也会发生在外部函数中,直到遇到合适的catch块为止)。
我的问题:
假设异常是在具有合适的后续catch的try块内抛出的,会为try块中定义的所有对象调用d’tor吗?还是应用于try块中定义的所有对象,直到出现异常?或者根本没有对象,然后他们会"等待"函数退出?
语义是,当控件离开块时,块中声明的任何局部变量都应该被销毁(函数是一个带有局部变量参数的命名块)。因此,当您离开try块时,任何本地创建的变量都将被销毁,并调用其相应的dtor。被创造的一切都被摧毁了,如果没有被创造,它就无法被摧毁。唯一没有被破坏的是异常对象本身,如果它被抛出的话(当然)。
来自C++规范:
15.2构造函数和析构函数1。当控件从抛出异常的点传递到处理程序,对所有构造的自动对象调用析构函数因为进入了try块。自动对象被销毁以完成的相反顺序
15.2构造函数和析构函数3.为自动构造的对象调用析构函数的过程在从try块到引发异常点的路径上称为"堆栈展开"
相关文章:
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 堆栈和队列是否像C++中的数组一样传递?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 堆栈中大小变量输入错误 (C++)
- 堆栈问题(平衡表达式问题集)
- C++ 在堆栈中包含多态属性的类对象存储
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 在 C++ 中使用链表进行堆栈
- 变量周围的堆栈'...'已损坏
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- C++线程的可用堆栈大小