一、SharedPtr
引用引用计数的浅拷贝
代码如下:
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;
};