智能指针SharedPtr
2016-03-20 20:41
246 查看
一、SharedPtr
引用引用计数的浅拷贝
代码如下:
二、SharedArray
对于数组而言,只是对上面的SharedPtr做简单的修改即可
(1)将_Release中的delete该为delete[ ]
(2)不再重载*、->这两个运算符,因为完全可以用[ ]来代替
代码如下:
引用引用计数的浅拷贝
代码如下:
template<class T> class SharedPtr { public: SharedPtr(T* ptr)//这里是正确的,因为是new出来的对象,而String类不是new出来的对象 :_ptr(ptr) // 不写成这样将是错误的,你就新开辟了一份空间,不是以前的空寂 , _pCount(new long(1)) {} ~SharedPtr() { _Release(); } SharedPtr(const SharedPtr<T> sp) :_ptr(sp._ptr) , _pCount(sp._pCount) { ++*_pCount; } //传统写法 //SharedPtr& operator=(const SharedPtr<T>& sp) //{ // if (_ptr != sp._ptr)//两个不同的对象地址虽然不一样,但是_ptr有可能一样 // { // _Release(); // _ptr = sp._ptr; // _pCount = sp._pCount; // ++*_pCount; // } // return *this; //} //现代写法 SharedPtr& operator=(SharedPtr<T> sp) { swap(_ptr, sp._ptr); swap(_pCount, sp._pCount); return *this; } public: T& operator*() { return *_ptr; } T* operator->()//本身自己的值不用修改,所以不加& { return _ptr; } T* GetPtr() { return _ptr; } long GetCount() { return *_pCount; } protected: void _Release() { if (--*_pCount == 0) { delete _ptr; delete _pCount; } } protected: T* _ptr; long* _pCount; };
二、SharedArray
对于数组而言,只是对上面的SharedPtr做简单的修改即可
(1)将_Release中的delete该为delete[ ]
(2)不再重载*、->这两个运算符,因为完全可以用[ ]来代替
代码如下:
template<class T> class SharedArray { public: SharedArray(T* ptr) :_ptr(ptr) , _pCount(new long(1)) {} ~SharedArray() { _Release(); } public: T& operator[](size_t index) { return _ptr[index]; } protected: void _Release() { if (--*_pCount == 0) { delete[] _ptr; delete _pCount; } } protected: T* _ptr; long* _pCount; };
相关文章推荐