Listing 8

#include <memory>
#include <iomanip>
#include <iostream>
using std::tr1::shared_ptr;
using std::cout; using std::boolalpha;

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 {}
  };
int main()
  { // demonstrate constructors, destructors, and reference count
  cout << boolalpha;
  resource *rp1 = new resource;
  shared_ptr<resource> sp1(rp1);
  cout << sp1.use_count() << ' ' << sp1.unique() << '\n';
  { // local object sp2 goes out of scope at end of block
  shared_ptr<resource> sp2(sp1);
  cout << boolalpha << sp1.use_count() << ' '        << sp1.unique() << '\n';
  cout << boolalpha << sp2.use_count() << ' '        << sp2.unique() << '\n';
  }
  cout << sp1.use_count() << ' ' << sp1.unique() << '\n';
  return 0;
  }