template<typename T>
class my_SharedPtr
{
public:
my_SharedPtr(T* ptr = NULL);
~my_SharedPtr();
my_SharedPtr(my_SharedPtr<T>& ptr);
my_SharedPtr<T>& operator=(my_SharedPtr<T>& ptr);
private:
T* _ptr;
int* _pCount;
};
template<typename T>
my_SharedPtr<T>::my_SharedPtr(T* ptr = NULL)
:_ptr(ptr)
{
if (NULL != ptr)
{
_pCount = new int(1);
}
}
template<typename T>
my_SharedPtr<T>::~my_SharedPtr()
{
if (--(*_pCount) == 0)
{
delete _ptr;
delete _pCount;
_ptr = NULL;
_pCount = NULL;
}
}
template<typename T>
my_SharedPtr<T>::my_SharedPtr(my_SharedPtr<T>& ptr)
:_ptr(ptr._ptr),
_pCount(ptr._pCount)
{
if (ptr._pCount != NULL)
++(*_pCount);
}
template<typename T>
my_SharedPtr<T>& my_SharedPtr<T>::operator=(my_SharedPtr<T>& ptr)
{
if (ptr._ptr != _ptr)
{
if (NULL == _ptr)
{
_ptr = ptr._ptr;
_pCount = ptr._pCount;
}
else
{
if (--(*_pCount) == 0)
{
delete _ptr;
delete _pCount;
}
_ptr = ptr._ptr;
_pCount = ptr._pCount;
}
if (NULL != _pCount)
++(*_pCount);
}
return *this;
}
模拟实现shared_ptr
最新推荐文章于 2024-09-04 10:57:59 发布