リソース取得初期化 (RAII) とはどういう意味ですか?
ベストアンサー1
これは非常に強力な概念に対して本当にひどい名前であり、おそらく C++ 開発者が他の言語に切り替えるときに最も見逃すものの 1 つです。この概念をScope-Bound Resource Managementに改名しようとする動きが少しありましたが、まだ定着していないようです。
「リソース」とは、メモリだけを意味するのではありません。ファイル ハンドル、ネットワーク ソケット、データベース ハンドル、GDI オブジェクトなども含まれます。つまり、リソースの供給量が限られているため、その使用を制御できる必要があります。「スコープ境界」の側面とは、オブジェクトの有効期間が変数のスコープにバインドされていることを意味します。そのため、変数がスコープ外になると、デストラクタがリソースを解放します。この非常に便利な特性は、例外安全性が向上することです。たとえば、次の例を比較してください。
RawResourceHandle* handle=createNewResource();
handle->performInvalidOperation(); // Oops, throws exception
...
deleteResource(handle); // oh dear, never gets called so the resource leaks
RAII 1では
class ManagedResourceHandle {
public:
ManagedResourceHandle(RawResourceHandle* rawHandle_) : rawHandle(rawHandle_) {};
~ManagedResourceHandle() {delete rawHandle; }
... // omitted operator*, etc
private:
RawResourceHandle* rawHandle;
};
ManagedResourceHandle handle(createNewResource());
handle->performInvalidOperation();
後者の場合、例外がスローされスタックがアンワインドされると、ローカル変数が破棄され、リソースがクリーンアップされ、リークされないことが保証されます。