share_ptr

//有些时候一个原始指针需要再多个地方多个县城中共享使用,所以auto_ptr不能满足需求,需要一种依靠原始指针的
//使用计数来管理的共享智能指针对象。(内核对象)句柄类:智能指针
template <typename T>
class my_shared_ptr
{
public:
	explicit my_shared_ptr() : /*m_pCount(NULL), */m_ptr(NULL)
	{
		
	}
	explicit my_shared_ptr(T* ptr) : /*m_pCount(NULL), */m_ptr(NULL)
	{
		//m_pCount = new int(1);
		m_ptr = ptr;
		m_ptr->AddRef();
	}
	explicit my_shared_ptr(my_shared_ptr<T>& ptr) : /*m_pCount(NULL), */m_ptr(NULL)
	{
		//m_pCount = ptr.GetCount();
		m_ptr = ptr.GetPtr();
		//++*m_pCount;
		m_ptr->AddRef();
	}
	template<typename TT>
	my_shared_ptr(my_shared_ptr<TT>& ptr) : m_pCount(NULL), m_ptr(NULL)
	{
		//m_pCount = ptr.GetCount();
		m_ptr = (T*)ptr.GetPtr();
		//++*m_pCount;
		m_ptr->AddRef();
	}
	T* GetPtr()
	{
		return m_ptr;
	}
	~my_shared_ptr()
	{
		//if (m_pCount != NULL)
		//{
		//	--*m_pCount;
		//	if (*m_pCount <= 0)
		//	{
		//		delete m_pCount;
		//		delete m_ptr;
		//	}
		//}
		m_ptr->ReleaseRef();
	}
	//int* GetCount()
	//{
	//	return m_pCount;
	//}
private:
	//int *m_pCount;
	T* m_ptr;
};

//自己的智能指针模板
//为了保证所有想使用智能指针管理的对象都拥有使用计数成员和用来增减使用计数的方法同意放入基类中
class CRefBase
{
public:
	CRefBase() : m_iCount(0)
	{
	}
	virtual long AddRef()
	{
		return ++m_iCount;
	}
	virtual void ReleaseRef()
	{
		--m_iCount;
		if (m_iCount <= 0)
		{
			delete this;
		}
	}
private:
	int m_iCount;
};

//自定义的类需要使用智能指针
class CTest : public CRefBase
{
public:
	CTest()
	{
	}
};

int main()
{
	//int* q = new int(12345);
	//my_shared_ptr<int> a(q);
	//my_shared_ptr<int> b(a);
	//my_shared_ptr<short> c(a);
	CTest* tt = new CTest;
	my_shared_ptr<CTest> test(tt);
	my_shared_ptr<CTest> test2(tt);
	my_shared_ptr<CTest> test3(tt);

你可能感兴趣的:(share_ptr)