Listing 4

#include <iostream>
#include <memory>
#include <stdlib.h>
using std::auto_ptr; using std::cout;

struct resource
  { // trace resource allocation and release
  resource()
    { // report allocation
    cout << "resource allocated at " << (void*)this << '\n';
    }
  ~resource()
    { // report release
    cout << "resource released at " << (void*)this << '\n';
    }
  void do_something() const {}
  };
resource *res0;
resource *res1;
auto_ptr<resource> res2;

void init_resources()
  { // allocate three resource objects
  if (!res0)
    res0 = new resource;
  if (!res1)
    res1 = new resource;
  if (!res2.get())
    res2 = auto_ptr<resource>(new resource);
  }
void release_res0()
  { // release resource pointed to by res0
  delete res0;
  }
struct release_res1
  { // release resource pointed to by res1
  ~release_res1() { delete res1; }
  };
release_res1 rel1;
void use_resources()
  { // use both resources
  init_resources();
  res0->do_something();
  res1->do_something();
  }
void use_one_resource()
  { // use one resource
  if (!res0)
    res0 = new resource;
  res0->do_something();
  }
int main()
  { // use managed resources
  atexit(release_res0);
  use_one_resource();
  use_resources();
  return 0;
  }