为了账号安全,请及时绑定邮箱和手机立即绑定

什么是堆栈展开?

什么是堆栈展开?

C++
萧十郎 2019-09-18 13:33:24
什么是堆栈展开?通过搜索但找不到启发性的答案!
查看完整描述

3 回答

?
浮云间

TA贡献1829条经验 获得超3个赞

所有这些都与C ++有关:

定义:当您静态创建对象(在堆栈上而不是在堆内存中分配它们)并执行函数调用时,它们会“堆叠”。

当一个范围(由{and 分隔的任何东西})退出时(通过使用return XXX;,到达范围的末尾或抛出异常),该范围内的所有内容都将被销毁(析构函数将被调用)。这种破坏本地对象和调用析构函数的过程称为堆栈展开。

您有以下与堆栈展开相关的问题:

  1. 避免内存泄漏(由本地对象管理并在析构函数中清理的任何动态分配将被泄露) - 请参阅Nikolai 提到的 RAII ,以及boost :: scoped_ptr的文档或使用boost :: mutex的示例:: scoped_lock。

  2. 程序一致性:C ++规范规定在处理任何现有异常之前,不应抛出异常。这意味着,在堆栈展开过程中不应该抛出异常(或者只使用不保证代码析构函数抛出,或环绕一切都在析构函数与try {} catch(...) {})。

如果任何析构函数在堆栈展开期间抛出异常,则最终会出现未定义的行为,这可能导致程序意外终止(最常见的行为)或Universe结束(理论上可行,但在实践中尚未观察到)。


查看完整回答
反对 回复 2019-09-18
?
青春有我

TA贡献1784条经验 获得超8个赞

在一般意义上,堆栈“展开”几乎与函数调用的结束和随后的堆栈弹出同义。

但是,特别是在C ++的情况下,堆栈展开与C ++如何调用自任何代码块启动以来分配的对象的析构函数有关。在块中创建的对象按其分配的相反顺序解除分配。


查看完整回答
反对 回复 2019-09-18
  • 3 回答
  • 0 关注
  • 472 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信