1. ホーム
  2. c++

[解決済み】スタック巻き戻しとは何ですか?

2022-04-06 04:57:26

質問

スタック巻き戻しとは何ですか?検索してみたのですが、納得のいく答えが見つかりませんでした。

どのように解決するのですか?

スタックの巻き戻しは、通常、例外処理と関連して語られます。以下はその例です。

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 のデストラクタを使用します。スタック上に確保されたオブジェクトは、スコープが終了したときに "unound"されます (ここでは、スコープは関数 func .) これは,コンパイラが自動(スタック)変数のデストラクタの呼び出しを挿入することによって行われる.

という技術につながる非常に強力な概念です。 RAII ということです。 資源獲得は初期化 C++でメモリ、データベース接続、オープンファイルディスクリプタなどのリソースを管理するのに役立ちます。

これで 例外安全性保証 .