什么是堆栈展开?

什么是堆栈展开?通过搜索但找不到启发性的答案!



萧十郎
浏览 473回答 3
3回答

浮云间

所有这些都与C ++有关:定义:当您静态创建对象(在堆栈上而不是在堆内存中分配它们)并执行函数调用时,它们会“堆叠”。当一个范围(由{and 分隔的任何东西})退出时(通过使用return XXX;,到达范围的末尾或抛出异常),该范围内的所有内容都将被销毁(析构函数将被调用)。这种破坏本地对象和调用析构函数的过程称为堆栈展开。您有以下与堆栈展开相关的问题:避免内存泄漏(由本地对象管理并在析构函数中清理的任何动态分配将被泄露) - 请参阅Nikolai 提到的 RAII ,以及boost :: scoped_ptr的文档或使用boost :: mutex的示例:: scoped_lock。程序一致性:C ++规范规定在处理任何现有异常之前,不应抛出异常。这意味着,在堆栈展开过程中不应该抛出异常(或者只使用不保证代码析构函数抛出,或环绕一切都在析构函数与try {和} catch(...) {})。如果任何析构函数在堆栈展开期间抛出异常,则最终会出现未定义的行为,这可能导致程序意外终止(最常见的行为)或Universe结束(理论上可行,但在实践中尚未观察到)。

青春有我

在一般意义上,堆栈“展开”几乎与函数调用的结束和随后的堆栈弹出同义。但是,特别是在C ++的情况下,堆栈展开与C ++如何调用自任何代码块启动以来分配的对象的析构函数有关。在块中创建的对象按其分配的相反顺序解除分配。
打开App,查看更多内容
随时随地看视频慕课网APP