template class Handle { public: Handle(): use(new int(1)), p(0) { } Handle(T* tp): use(new int(1)), p(tp) { } Handle(const Handle& h): use(h.use), p(h.p) { ++*use; } Handle& operator=(const Handle& h) { ++*h.use; if (--*use == 0) { delete use; delete p; } p = h.p; use = h.use; return *this; } T* operator->() const { return p; } T& operator*() const { return *p; } ~Handle() { if (--*use == 0) { delete use; delete p; } } private: T* p; int* use; };