智能指针SharedPtr

一、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;
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值