一种智能指针的实现方式

来源:互联网 发布:电信宽带网络线路故障 编辑:程序博客网 时间:2024/05/01 16:27
#include<iostream>#include<stdexcept>using namespace std;#define TEST_SMARTPTRclass Stub{public:void print(){cout << "Stub:print" << endl;}~Stub(){cout << "Stub:Destructor" << endl;}};template<typename T>class SmartPtr{private:T* ptr;size_t* pUse;public:SmartPtr(T* p = 0) :ptr(p), pUse(new size_t(1)){}SmartPtr(const SmartPtr& src) : ptr(src.ptr), pUse(src.pUse){++*pUse;}SmartPtr& operator=(const SmartPtr& rhs){++*rhs.pUse;decrUse();ptr = rhs.ptr;pUse = rhs.pUse;return *this;}T* operator->(){if (ptr)return ptr;throw std::runtime_error("access through NULL pointer");}const T* operator->()const{if (ptr)return ptr;throw std::runtime_error("accessthroughNULLpointer");}T& operator*(){if (ptr)return *ptr;throw std::runtime_error("dereferenceofNULLpointer");}const T& operator*()const{if (ptr)return *ptr;throw std::runtime_error("dereferenceofNULLpointer");}~SmartPtr(){decrUse();#ifdef TEST_SMARTPTRstd::cout << "SmartPtr:Destructor" << std::endl;//fortesting#endif}private:void decrUse(){if (--*pUse == 0){delete ptr;delete pUse;}}};int main(){try{SmartPtr<Stub>t();}catch (const exception&err){cout << err.what() << endl;}SmartPtr<Stub>t1(new Stub);SmartPtr<Stub>t2(t1);SmartPtr<Stub>t3(new Stub);t3 = t2;t1->print();(*t3).print();return 0;}

0 0
原创粉丝点击