ベストアンサー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 の慣用句のより正確な名前だと考える人もいます。