リソース取得初期化(RAII)とはどういう意味ですか?質問する

リソース取得初期化(RAII)とはどういう意味ですか?質問する

リソース取得初期化 (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();

後者の場合、例外がスローされスタックがアンワインドされると、ローカル変数が破棄され、リソースがクリーンアップされ、リークされないことが保証されます。

おすすめ記事