#ifndef SHARE_PTR_H
#define SHARE_PTR_H
template<typename T>
class CSharePtr
{
public:
CSharePtr( T* ptr)
{
if(ptr)
{
m_pPtr = ptr;
m_nRef = new int(1);
}else
{
m_nRef = new int(1);
m_pPtr = nullptr;
}
}
CSharePtr(CSharePtr<T>& sptr)
{
m_nRef = sptr.m_nRef;
m_pPtr = sptr.m_pPtr;
(*m_nRef)++;
}
CSharePtr<T>& operator=(CSharePtr<T>& sptr)
{
if(this == &sptr)
{
return *this;
}
ReleasePtr();//删除当前指针
m_nRef = sptr.m_nRef;
m_pPtr = sptr.m_pPtr;
(*m_nRef)++;
return *this;
}
~CSharePtr()
{
ReleasePtr();
}
T getValue() const
{
return *m_pPtr;
}
T* operator->() const
{
return m_pPtr;
}
private:
void ReleasePtr()
{
if(--(*m_nRef) == 0)
{
delete m_pPtr;
m_pPtr = nullptr;
}
}
private:
int* m_nRef;
T* m_pPtr;
};
#endif
测试:
class A
{
public:
A()
{
cout<<"A()"<<endl;
}
~A()
{
cout<<"~A()"<<endl;
}
void Func()
{
cout<< "func() is excuted!"<<endl;
}
};
CSharePtr<A> sp = CSharePtr<A>(new A());
sp->Func();