Listing 3

#include <memory>
#include <iostream>
using std::tr1::shared_ptr; using std::tr1::weak_ptr;
using std::tr1::bad_weak_ptr;
using std::cout;

static void construct(weak_ptr<int> wp)
  { // construct shared_ptr object from weak_ptr object
  cout << " using constructor, ";
  try { // wrap construction
    shared_ptr<int> sp(wp);
    cout << "succeeded\n";
    }
  catch(const bad_weak_ptr& ex)
    { // something's wrong
    cout << "caught " << ex.what() << '\n';
    }
  }

static void lock(weak_ptr<int> wp)
  { // initialize shared_ptr object from wp.lock()
  cout << " using lock, ";
  shared_ptr<int> sp = wp.lock();
  if (sp)
    cout << "got ownership\n";
  else
    cout << "got empty object\n";
  }

int main()
  { // demonstrate weak_ptr/shared_ptr conversions
  shared_ptr<int> sp(new int);
  weak_ptr<int> wp(sp);
  cout << "Valid resource, use count is " << wp.use_count() << ":\n";
  construct(wp);
  lock(wp);
  sp.reset();
  cout << "Expired resource, use count is " << wp.use_count() << ":\n";
  construct(wp);
  lock(wp);
  return 0;
  }