基于C++ 11实现的智能指针

#include <atomic>
template<class T>
class AutoPtr
{
public:
	AutoPtr(){
		m_pData = nullptr;
		m_pRef = nullptr;
	}
	~AutoPtr(){
		Destroy();
	}
	AutoPtr(T *pData){
		reset(pData);
	}
	AutoPtr(AutoPtr &prhs){
		reset();
		if (!prhs){
			m_pData = prhs.get();
			m_pRef = prhs.ref_count();
			(*m_pRef)++;
		}
	}
	AutoPtr & operator =(AutoPtr &prhs){
		reset();
		if (prhs){
			m_pData = prhs.get();
			m_pRef = prhs.ref_count();
			(*m_pRef)++;
		}
		return *this;
	}

	AutoPtr & operator =(T *prhs){
		reset(prhs);
		return *this;
	}
	void reset(T *pData = nullptr){
		Destroy();	
		if (pData){
			m_pData = pData;
			m_pRef = new atomic<int>(1);
		}
	}
	T *get(){
		return m_pData;
	}

	T& operator *(){
		return *m_pData;
	}
	T* operator ->(){
		return m_pData;
	}
	explicit operator bool() const{
		return m_pData != nullptr;
	}
	bool operator !(){
		return get() == nullptr;
	}
	bool operator ==(AutoPtr &pCompare)	{
		return pCompare.get() == m_pData.get();
	}	
	bool operator != (AutoPtr &pCompare){
		return pCompare.get() != m_pData.get()
	}
	atomic<int> * ref_count(){
		return m_pRef;
	}

private:
	void Destroy(){
		if (m_pRef ){
			(*m_pRef)--;
			if (*m_pRef == 0){
				if (m_pData)
					delete m_pData;
				delete m_pRef;
			}
		}
		m_pData = nullptr;
		m_pRef = nullptr;
	}
	atomic<int> *m_pRef = nullptr; // 使用原子变量,允许智能指针的对象可跨线程访问
	T* m_pData = nullptr;
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值