什么是堆栈展开?通过搜索但找不到启发性的答案!
3 回答
浮云间
TA贡献1829条经验 获得超4个赞
所有这些都与C ++有关:
定义:当您静态创建对象(在堆栈上而不是在堆内存中分配它们)并执行函数调用时,它们会“堆叠”。
当一个范围(由{
and 分隔的任何东西}
)退出时(通过使用return XXX;
,到达范围的末尾或抛出异常),该范围内的所有内容都将被销毁(析构函数将被调用)。这种破坏本地对象和调用析构函数的过程称为堆栈展开。
您有以下与堆栈展开相关的问题:
避免内存泄漏(由本地对象管理并在析构函数中清理的任何动态分配将被泄露) - 请参阅Nikolai 提到的 RAII ,以及boost :: scoped_ptr的文档或使用boost :: mutex的示例:: scoped_lock。
程序一致性:C ++规范规定在处理任何现有异常之前,不应抛出异常。这意味着,在堆栈展开过程中不应该抛出异常(或者只使用不保证代码析构函数抛出,或环绕一切都在析构函数与
try {
和} catch(...) {}
)。
如果任何析构函数在堆栈展开期间抛出异常,则最终会出现未定义的行为,这可能导致程序意外终止(最常见的行为)或Universe结束(理论上可行,但在实践中尚未观察到)。
青春有我
TA贡献1784条经验 获得超8个赞
在一般意义上,堆栈“展开”几乎与函数调用的结束和随后的堆栈弹出同义。
但是,特别是在C ++的情况下,堆栈展开与C ++如何调用自任何代码块启动以来分配的对象的析构函数有关。在块中创建的对象按其分配的相反顺序解除分配。
- 3 回答
- 0 关注
- 497 浏览
添加回答
举报
0/150
提交
取消