C++ は 'finally' ブロックをサポートしていますか? (そして、よく耳にする 'RAII' とは何ですか?) 質問する

C++ は 'finally' ブロックをサポートしていますか? (そして、よく耳にする 'RAII' とは何ですか?) 質問する

C++は「ついに'ブロックですか?

何ですかRAIIイディオム?

C++のRAIIイディオムとの違いは何ですか?C# の 'using' ステートメント?

ベストアンサー1

いいえ、C++ は 'finally' ブロックをサポートしていません。その理由は、C++ が代わりに RAII (「Resource Acquisition Is Initialization」) をサポートしているためです。これは、非常に便利な概念の不適切な名前です。

オブジェクトのデストラクタはリソースを解放する役割を担うという考え方です。オブジェクトに自動保存期間がある場合、そのオブジェクトが作成されたブロックが終了すると、そのブロックが例外の存在下で終了した場合でも、オブジェクトのデストラクタが呼び出されます。ビャルネ・ストロストルップの説明トピックの。

RAII の一般的な用途は、ミューテックスのロックです。

// A class with implements RAII
class lock
{
    mutex &m_;

public:
    lock(mutex &m)
      : m_(m)
    {
        m.acquire();
    }
    ~lock()
    {
        m_.release();
    }
};

// A class which uses 'mutex' and 'lock' objects
class foo
{
    mutex mutex_; // mutex for locking 'foo' object
public:
    void bar()
    {
        lock scopeLock(mutex_); // lock object.

        foobar(); // an operation which may throw an exception

        // scopeLock will be destructed even if an exception
        // occurs, which will release the mutex and allow
        // other functions to lock the object and run.
    }
};

RAII は、オブジェクトを他のクラスのメンバーとして使用することも簡素化します。所有クラスが破棄されると、RAII クラスによって管理されるリソースは解放されます。これは、RAII 管理クラスのデストラクタが結果として呼び出されるためです。つまり、リソースを管理するクラスのすべてのメンバーに RAII を使用すると、メンバー リソースの有効期間を手動で管理する必要がないため、所有者クラスには非常に単純な、おそらくデフォルトのデストラクタを使用してもかまいません。(この点を指摘してくれたMike Bに感謝します。)

C#やVB.NETに詳しい人なら、RAIIが次のものに似ていることに気づくだろう。IDisposable と 'using' ステートメントを使用した .NET の決定論的破棄実際、この 2 つの方法は非常によく似ています。主な違いは、RAII はメモリを含むあらゆる種類のリソースを確定的に解放することです。.NET (.NET 言語の C++/CLI でも) で IDisposable を実装すると、メモリ以外のリソースは確定的に解放されます。.NET では、メモリは確定的に解放されません。メモリはガベージ コレクション サイクル中にのみ解放されます。

 

† 「破壊は資源の放棄である」という表現の方が RAII の慣用句のより正確な名前だと考える人もいます。

おすすめ記事