cpp/language/raii

Resource Acquisition Is Initialization or RAII, is a C++ programming technique which binds the life cycle of a resource that must be acquired before use (allocated heap memory, thread of execution, open socket, open file, locked mutex, disk space, database connection—anything that exists in limited supply) to the  of an object.

RAII guarantees that the resource is available to any function that may access the object (resource availability is a class invariant, eliminating redundant runtime tests). It also guarantees that all resources are released when the lifetime of their controlling object ends, in reverse order of acquisition. Likewise, if resource acquisition fails (the constructor exits with an exception), all resources acquired by every fully-constructed member and base subobject are released in reverse order of initialization. This leverages the core language features (,, and ) to eliminate resource leaks and guarantee exception safety. Another name for this technique is Scope-Bound Resource Management (SBRM), after the basic use case where the lifetime of an RAII object ends due to scope exit.

RAII can be summarized as follows:
 * encapsulate each resource into a class, where
 * the constructor acquires the resource and establishes all class invariants or throws an exception if that cannot be done,
 * the destructor releases the resource and never throws exceptions;


 * always use the resource via an instance of a RAII-class that either
 * has automatic storage duration or temporary lifetime itself, or
 * has lifetime that is bounded by the lifetime of an automatic or temporary object

Classes with /, /, or // member functions are typical examples of non-RAII classes:

The standard library
The C++ library classes that manage their own resources follow RAII: std, std, and many others acquire their resources in constructors (which throw exceptions on errors), release them in their destructors (which never throw), and don't require explicit cleanup.