shared_ptr 的簡單實現

如果對shared_ptr是什麼不是很清楚,可以百度或是參考C++primer等參考書。

文章只是對其進行了一個簡單實現,來模擬shared_ptr的功能。


實現方式是添加了一層中間的節點。如下圖所示

具體代碼實現如下:


#include<iostream>
using namespace std;

template<class T>
class SmartPtr;

template<class T>
class Uptr
{
private:
	typedef	 T	valueType;
	typedef	 T*	valuePtr;
	friend class SmartPtr<valueType>;
private:
	//construct function
	Uptr(valuePtr ps) :p(ps)
	{ 
		count = 1;
	}
	~Uptr()
	{
		delete p;
	}
private:
	valuePtr p;
	unsigned count;

};

template<class T>
class SmartPtr
{
public:
	typedef  T	valueType;
	typedef  T*	valuePtr;
public:
	SmartPtr(valuePtr p) :uptr(new Uptr<valueType>(p))
	{}
	~SmartPtr()
	{
		deconstruct();
	}
	SmartPtr(const SmartPtr<valueType>& sp):uptr(sp.uptr)
	{
		//uptr = sp.uptr;
		uptr->count++;
		cout << "Used SmartPtr(const SmartPtr&)" << endl;
		cout << "-----Have " << uptr->count << "ptr ref this!" << endl;
	}
	SmartPtr& operator=(const SmartPtr<valueType>& sp)
	{
		--uptr->count;
		if (uptr->count == 0)
			deconstruct();
		uptr = sp.uptr;
		++uptr->count;
		cout << "Used SmartPtr& operator=(const SmartPtr&)" << endl;
		cout << "-----Have " << uptr->count << "ptr ref this!" << endl;
		return *this;
	}
	valueType& operator* ()
	{
		return *(uptr->p);
	}
	valuePtr operator->()
	{
		return &(operator*());
	}
private:
	void deconstruct()
	{
		--uptr->count;
		if (uptr->count == 0)
		{
			delete uptr;
		}
		else
			cout << "Still have " << uptr->count << " ptr ref this val !";
	}
	
private:
	Uptr<valueType> *uptr;
};
int main()
{

	int i = 0;
	SmartPtr<int> p(&i);
	SmartPtr<int> kk = p;
	{
		SmartPtr<int> k = p;
	}
	SmartPtr<int> z = p;
	return 0;
}

運行效果圖如下:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章