小编典典

什么是堆栈展开?

all

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


阅读 93

收藏
2022-06-07

共1个答案

小编典典

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

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当退出范围时,分配在堆栈上的对象被“展开”(这里的范围是
function func)。这是通过编译器插入对自动(堆栈)变量的析构函数的调用来完成的。

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

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

2022-06-07