您的位置:首页 > 其它

智能指针SharedPtr

2016-03-20 20:41 246 查看
一、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;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  智能指针