最小功能shared_ptr

#include <windows.h>


class AutoCount
{
	volatile long m_count;
public:
	AutoCount() : m_count(1)
	{}

	AutoCount(long count):m_count(count){
	}

	void AddReference()
	{
	  ::InterlockedIncrement(&m_count);
	}

	void Release()
	{
	   ::InterlockedDecrement(&m_count);
	}


	long GetCount()
	{
		return m_count;
	}
};


//SharedPtr<CXX>ptr 不是 SharedPtr<CXX*>
template<typename Object>
class SharedPtr
{
	AutoCount* m_rc;//指针,方便m_rc->AddReferenceCount();
	Object* m_ptr;//若用Object, std::swap(m_ptr, ptr->m_ptr); error


	void Release()
	{
		m_rc->Release();

		if ( m_ptr != NULL && m_rc->GetCount() == 0 ) {
			delete m_ptr; //注意不是delete this;
			m_ptr = NULL;

			delete m_rc; //注意这个不要掉了
			m_rc = NULL;
		}
	}

	void AddReference()
	{
	   m_rc.AddReference();
	}

public:
	int GetCount() 
	{
	   return m_rc->GetCount();
	}

	Object* get()
	{
	   return m_ptr;
	}

	const Object* get() const
	{
	   return m_ptr;
	}

public:
	SharedPtr() : m_ptr(NULL), m_rc( new AutoCount )//能这样吗?
	{
	}

	SharedPtr(Object* obj):m_ptr(obj), m_rc(new AutoCount)
	{};


	SharedPtr(const SharedPtr & ptr) : m_ptr(ptr->m_ptr), m_rc(ptr->m_rc)
	{
	   m_rc->AddReference();
	}


	~SharedPtr()
	{
	   Release();
	}

	void Swap( SharedPtr & ptr)
	{
		std::swap(m_ptr, ptr.m_ptr);
		std::swap(m_rc, ptr.m_rc);
	}

	Object* operator->()
	{
		return m_ptr;
	}

	const SharedPtr* operator->() const
	{
		return this;
	}

	SharedPtr& operator=(const SharedPtr & ptr) //Shared_ptr<Object>
	{
		if ( this != &ptr ) {
			SharedPtr tmp(ptr); //去掉const属性,同时AddReference
			Swap( tmp );
		}

		return *this;
	}

	SharedPtr& operator= ( Object* obj)
	{
		if ( m_ptr != obj ) {
			Release();	
			
			AutoCount* pTmp = new AutoCount;
			m_rc = pTmp;
			m_ptr = obj;
		}

		return *this;
	}
};


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值