#include <iostream>
#include <cstdlib>
#include <memory>

class MyInt
{
private:
   int val;

public:
   MyInt() : val(0)          { std::cout << "default c'tor called" << std::endl; }
   MyInt(int rhs) : val(rhs) { std::cout << "c'tor (" << rhs << ") called" << std::endl; }
   ~MyInt()                  { std::cout << "d'tor called" << std::endl; }
   int getval (void)         { return val; }
};

int main()
{
   std::shared_ptr<MyInt> pt = std::make_shared<MyInt>(3);

   MyInt* pt2 = pt.get();

   std::cout << "reference count " << pt.use_count() << std::endl;

   pt = 0;

   std::cout << pt2->getval() << std::endl;
}