Skip to main content

  | मौसम…

411 समाचार
Public archive edition · Attributed source reporting with original dates · AI drafts are excluded

411 REFERENCE · Wikibooks

More C++ Idioms/Scope Guard

Reference material by Wikibooks contributors. This retains its source identity and is not 411 news reporting.

Scope Guard Intent To ensure that resources are always released in face of an exception but not while returning normally To provide basic exception safety guarantee Also Known As Motivation Resource Acquisition is Initialization (RAII) idiom allows us to acquire resources in the constructor and release them in the destructor when scope ends successfully or due to an exception. It will always release resources. This is not very flexible. Sometime we don't want to release resources if no exception is thrown but we do want to release them if an exception is thrown. Solution and Sample Code Enhance the typical implementation of the Resource Acquisition is Initialization (RAII) idiom with a conditional check. 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. } Known Uses 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 Related Idioms Resource Acquisition Is Initialization (RAII) References Generic: Change the Way You Write Exception-Safe Code — Forever SCOPE_FAILURE and SCOPE_SUCCESS in C++: ScopeGuards without need to release/commit by hands ja:More C++ Idioms/スコープ防壁(Scope Guard)