smart_ptr (learn from boost::shared_ptr)