C++RAII:リソース取得が初期化される


備考

RAIIはcquisitionにI S Iの nitializationをesource Rの略です。 SBRM(Scope-Based Resource Management)またはRRID(Resource Release Is Destruction)とも呼ばれることがありますが、RAIIはリソースをオブジェクトの存続期間に結びつけるために使用されるイディオムです。 C ++では、オブジェクトのデストラクターは、オブジェクトがスコープ外になったときに常に実行されます。これを利用して、リソースのクリーンアップをオブジェクトの破棄に結びつけることができます。

最終的に解放する必要のあるリソース(ロック、ファイルハンドル、割り当て済みバッファなど)を取得する必要がある場合はいつでも、オブジェクトを使用してそのリソース管理を処理することを検討する必要があります。スタックのアンワインディングは、例外または早期スコープの終了に関係なく発生するので、リソースハンドラオブジェクトは、すべての可能な現在および将来のコードパスを慎重に検討することなく、リソースをクリーンアップします。

RAIIがリソースの存続期間を考える開発者を完全に解放しないことは注目に値する。 1つのケースは、明らかに、デストラクタが呼び出されないようにするクラッシュまたはexit()コールです。プロセスの終了後、OSはメモリのようなプロセスローカルリソースをクリーンアップするので、これはほとんどの場合問題ではありません。しかし、システム・リソース(すなわち名前付きパイプ、ロック・ファイル、共有メモリー)では、プロセスがそれ自身の後でクリーンアップしなかった場合、つまりロック・ファイルがある場合はスタートアップ・テストでそれを処理するための機能が必要です。実際にpidを持つプロセスを確認し、それに応じて動作します。

別の状況は、UNIXプロセスがexec-familyから関数を呼び出すとき、つまりfork-execの後に新しいプロセスを作成するときです。ここで、子プロセスは親メモリ(RAIIオブジェクトを含む)のフルコピーを持ちますが、execが呼び出されると、そのプロセスではデストラクタのどれも呼び出されません。一方、プロセスがforkされ、いずれのプロセスもexecを呼び出さない場合は、両方のプロセスですべてのリソースがクリーンアップされます。これは実際にフォークに複製されたすべてのリソースに対してのみ有効ですが、システムリソースでは両方のプロセスがリソースへの参照(ロックファイルへのパス)のみを持ち、個別に解放しようとします他のプロセスは失敗する。

RAII:リソース取得が初期化される 関連する例