#include <iostream> template<typename T> class SmartPointer { public: SmartPointer(T* ptr):_ptr(ptr) { if (ptr) _count = new size_t(1); else _count = new size_t(0); } SmartPointer(const SmartPointer& sp) { if (&sp != this) { _count = sp.count; _ptr = sp.ptr; ++*_count; } } SmartPointer& operator=(const SmartPointer& sp) { if (&sp == this) return *this; if (_ptr) { --*_count; if (_count <= 0) { delete _ptr; delete _count; _ptr = nullptr; _count = nullptr; } } _ptr = sp._ptr; _count = sp.count; ++_count; return *this; } T& operator*() { assert(_ptr == nullptr); return *_ptr; } T* operator->() { assert(_ptr == nullptr); return *_ptr; } size_t use_count() { return *_count; } private: T* _ptr; size_t* _count; };