什么是堆栈展开?

新手上路,请多包涵

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

原文由 Rajendra Uppal 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 726
2 个回答

堆栈展开通常与异常处理有关。这是一个例子:

 void func( int x )
{
    char* pleak = new char[1024]; // might be lost => memory leak
    std::string s( "hello world" ); // will be properly destructed

    if ( x ) throw std::runtime_error( "boom" );

    delete [] pleak; // will only get here if x == 0. if x!=0, throw exception
}

int main()
{
    try
    {
        func( 10 );
    }
    catch ( const std::exception& e )
    {
        return 1;
    }

    return 0;
}

如果抛出异常,分配给 pleak 的内存将丢失,而分配给 s 的内存将由 std::string 析构函数在任何情况下正确释放。当退出范围时,分配在堆栈上的对象将“展开”(这里的范围是函数 func 。)这是通过编译器插入对自动(堆栈)变量的析构函数的调用来完成的。

现在这是一个非常强大的概念,导致了称为 RAII 的技术,即 Resource Acquisition Is Initialization ,它可以帮助我们在 C++ 中管理诸如内存、数据库连接、打开文件描述符等资源。

现在这允许我们提供 异常安全保证

原文由 Nikolai Fetissov 发布,翻译遵循 CC BY-SA 4.0 许可协议

堆栈展开是在运行时从函数调用堆栈中删除函数条目的过程。它通常与异常处理有关。在 C++ 中,当发生异常时,会在函数调用堆栈中线性搜索异常处理程序的所有条目,然后将具有异常处理程序的函数从函数调用堆栈中删除。

原文由 Sarath Govind 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题