More C++ Idioms/スコープ防壁(Scope Guard)

スコープ防壁(Scope Guard)

編集

意図

編集
  • 例外送出時に常にリソースを解放する一方、関数が通常通り返る場合には解放しないことを保証する。
  • 基本例外保証を提供する。

別名

編集

動機

編集

リソース獲得は初期化である(Resource Acquisition Is Initialization)(RAII) イディオムは、コンストラクタでリソースを獲得し、スコープの正常終了時か例外時にデストラクタで解放することを可能とする。この場合、常にリソースを解放する。これはあまり柔軟ではない。例外が送出された場合はリソースを解放するが、送出されなかった場合にはリソースを解放したくない場合がある。

解放とサンプルコード

編集

リソース獲得は初期化である(Resource Acquisition Is Initialization)(RAII) イディオムの典型的な実装を、条件判断をつけて強化する。

class ScopeGuard
{
  ScopeGuard () 
   : engaged_ (true) 
  { /* ここでリソースを獲得する。 */ }
  
  ~ScopeGuard ()  
  { 
    if (engaged_) 
     { /* ここでリソースを解放する。 */} 
  }
  void release () 
  { 
     engaged_ = false; 
     /* もはやリソースは解放されない。 */ 
  }
};
void some_init_function ()
{
  ScopeGuard guard;
  // ...... ここでなにか例外が送出されるかもしれない。その場合はリソースを解放する。
  guard.release (); // 通常の実行時はリソースは解放されない。
}

既知の利用

編集
  • boost::mutex::scoped_lock
  • boost::scoped_ptr
編集

References

編集