#include <boost/smart_ptr.hpp>

class Foo {
  public:
    boost::shared_ptr<Foo> s_ptr;
    boost::weak_ptr<Foo> w_ptr;

    Foo ()
      {
        std::cout << "Foo (): allocate big piece by " << this << std::endl;
      }
    ~Foo ()
      {
        std::cout << "~Foo (): deallocate the piece by " << this << std::endl;
      }
};

int main (int argc, char *argv[])
{
  boost::shared_ptr<Foo> foo (new Foo);

  if (1 < argc ? argv[1][0] - '0' : 0)
    foo->s_ptr = boost::shared_ptr<Foo> (foo);
  else
    foo->w_ptr = boost::weak_ptr<Foo> (foo);

  return 0;
}