跳转到内容

更多 C++ 习语/作用域保护

来自维基教科书,开放世界中的开放书籍

作用域保护

[编辑 | 编辑源代码]
  • 确保资源始终在遇到异常时释放,但在正常返回时不释放
  • 提供基本异常安全保证

也称为

[编辑 | 编辑源代码]

资源获取即初始化 (RAII) 习语允许我们在构造函数中获取资源,并在作用域成功结束或由于异常而结束时在析构函数中释放它们。它将始终释放资源。这不是很灵活。有时我们不想在没有抛出异常的情况下释放资源,但如果抛出异常,我们确实希望释放它们。

解决方案和示例代码

[编辑 | 编辑源代码]

使用条件检查增强 资源获取即初始化 (RAII) 习语的典型实现。

class ScopeGuard
{
public:
  ScopeGuard () 
   : engaged_ (true) 
  { /* Acquire resources here. */ }
  
  ~ScopeGuard ()  
  { 
    if (engaged_) 
     { /* Release resources here. */} 
  }
  void release () 
  { 
     engaged_ = false; 
     /* Resources will no longer be released */ 
  }
private:
  bool engaged_;
};
void some_init_function ()
{
  ScopeGuard guard;
  // ...... Something may throw here. If it does we release resources.
  guard.release (); // Resources will not be released in normal execution.
}

已知用途

[编辑 | 编辑源代码]
  • boost::mutex::scoped_lock
  • boost::scoped_ptr
  • std::auto_ptr
  • ACE_Guard
  • ACE_Read_Guard
  • ACE_Write_Guard
  • ACE_Auto_Ptr
  • ACE_Auto_Array_Ptr
[编辑 | 编辑源代码]

参考资料

[编辑 | 编辑源代码]
华夏公益教科书