template class SmartPtr { public: SmartPtr(T o) { m_Obj = new DataObj(o); } SmartPtr(const SmartPtr& rh) { m_Obj = rh.m_Obj; m_Obj->AddRef(); } SmartPtr& operator=(const SmartPtr& rh) { if (this == &rh) return *this; if (m_Obj != NULL) m_Obj->Release(); m_Obj = rh.m_Obj; m_Obj->AddRef(); return *this; } T* operator->() const { return m_Obj->m_Ptr; } T& operator*() const { return *m_Obj->m_Ptr; } operator T*() const { return m_Obj->m_Ptr; } ~SmartPtr() { m_Obj->Release(); } private: class DataObj { public: DataObj(T o) : m_ReferenceCount(0) { m_Ptr = new T(o); AddRef(); } unsigned int AddRef() { return m_ReferenceCount++; } void Release() { if (--m_ReferenceCount == 0) { delete m_Ptr; delete this; } } T* m_Ptr; unsigned int m_ReferenceCount; }; DataObj* m_Obj; };