更多 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
- 资源获取即初始化 (RAII)