ライイ。
コンストラクタとデストラクタで始まりますが、それ以上のものです。
例外の存在下でリソースを安全に制御することがすべてです。
RAII が final やそのようなメカニズムよりも優れているのは、オブジェクトを正しく使用する責任がオブジェクトのユーザーからオブジェクトの設計者に移されるため、コードをより安全に使用できるようになることです。
これを読む
RAIIを使ってStdioFileを正しく使う例。
void someFunc()
{
StdioFile file("Plop","r");
// use file
}
// File closed automatically even if this function exits via an exception.
finally と同じ機能を取得するには。
void someFunc()
{
// Assuming Java Like syntax;
StdioFile file = new StdioFile("Plop","r");
try
{
// use file
}
finally
{
// close file.
file.close(); //
// Using the finaliser is not enough as we can not garantee when
// it will be called.
}
}
try{} finally{} ブロックを明示的に追加する必要があるため、このコーディング方法はエラーが発生しやすくなります (つまり、例外について考える必要があるのはオブジェクトのユーザーです)。RAII 例外安全性を使用することにより、オブジェクトの実装時に 1 回コード化する必要があります。
問題は、この C++ 固有のものです。
短い答え: いいえ。
より長い答え:
コンストラクター/デストラクタ/例外と、定義された有効期間を持つオブジェクトが必要です。
技術的には、例外は必要ありません。例外が存在する場合のリソースの制御が非常に簡単になるため、例外が潜在的に使用される可能性がある場合は、はるかに便利になります。
ただし、制御が関数を早期に終了し、すべてのコードを実行できないすべての状況で役立ちます (関数からの早期復帰など)。これが、C の複数のリターン ポイントが悪いコード臭であるのに対し、C++ の複数のリターン ポイントはコードの悪臭ではない理由です。コードの臭い [RAII を使用してクリーンアップできるため])。
C++ では、スタック変数またはスマート ポインターによって制御された有効期間が実現されます。しかし、寿命を厳密に管理できるのはこれだけではありません。たとえば、Perl オブジェクトはスタックベースではありませんが、参照カウントのために寿命が非常に制御されています。