#include <iostream> #include <string> using namespace std; namespace MySmartPtr { class PtrCount; template<class T> class AutoPtr; }; class PtrCount { private: int m_iptrCount; public: PtrCount(int iNum = 0){m_iptrCount = iNum;} ~PtrCount(){} int addRef(){return (++m_iptrCount);} int release(){return(--m_iptrCount);} }; template<class T> class AutoPtr { private: T * m_RawPtr; PtrCount *m_ptrCount ; public: AutoPtr(T *ptr = NULL){m_RawPtr = ptr;m_ptrCount = new PtrCount(1);} ~AutoPtr(){if(m_ptrCount->release() == 0) {delete m_RawPtr;delete m_ptrCount;}} T *operator-> (void) { return m_RawPtr;} T& operator *(void) { return *m_RawPtr;} AutoPtr & operator = (const AutoPtr<T> & pAutoPtr) { if(m_ptrCount->release() == 0) {delete m_RawPtr;delete m_ptrCount;} m_RawPtr = pAutoPtr.m_RawPtr; m_ptrCount = pAutoPtr.m_ptrCount; if (m_ptrCount) m_ptrCount->addRef(); return *this; } }; int main() { AutoPtr<string> strAutoPtr(new string("智能指针测试")); cout<<(*strAutoPtr)<<endl; AutoPtr<string> strAutoPtr2(new string("复制测试指针")); cout<<(*strAutoPtr2)<<endl; strAutoPtr = strAutoPtr2; cout<<(*strAutoPtr)<<endl; return 0; }