$ curl cheat.sh/
/*
 * It's a really terrible name for an incredibly powerful concept, and
 * perhaps one of the number 1 things that C++ developers miss when they
 * switch to other languages.  There has been a bit of a movement to try
 * to rename this concept as **Scope-Bound Resource Management**, though
 * it doesn't seem to have caught on just yet.
 * 
 * When we say 'Resource' we don't just mean memory - it could be file
 * handles, network sockets, database handles, GDI objects...  In short,
 * things that we have a finite supply of and so we need to be able to
 * control their usage.  The 'Scope-bound' aspect means that the lifetime
 * of the object is bound to the scope of a variable, so when the
 * variable goes out of scope then the destructor will release the
 * resource.  A very useful property of this is that it makes for greater
 * exception-safety.  For instance, compare this:
 */

 RawResourceHandle* handle=createNewResource();
 handle->performInvalidOperation();  // Oops, throws exception
 ...
 deleteResource(handle); // oh dear, never gets called so the resource leaks

// With the RAII one

 class ManagedResourceHandle {
 public:
    ManagedResourceHandle(RawResourceHandle* rawHandle_) : rawHandle(rawHandle_) {};
    ~ManagedResourceHandle() {delete rawHandle; }
    ... // omitted operator*, etc
 private:
    RawResourceHandle* rawHandle;
 };

 ManagedResourceHandle handle(createNewResource());
 handle->performInvalidOperation();

/*
 * In this latter case, when the exception is thrown and the stack is
 * unwound, the local variables are destroyed which ensures that our
 * resource is cleaned up and doesn't leak.
 * 
 * [the_mandrill] [so/q/2321511] [cc by-sa 3.0]
 */

$
Follow @igor_chubin cheat.sh