如果對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;
}
運行效果圖如下: