您的位置:首页 > 其它

闲来无事,写了一个简单的智能指针

2009-02-15 14:43 495 查看
#pragma once
/*
int *p = new int(9);
SharedPtr<int> px(p);			//ok
SharedPtr<int> py(new int(9));	//good
SharedPtr<int> pz = px;			//good
SharedPtr<int> pw(p);			//Error, NO!! because of px.
*/
template<class T>
class SharedPtr
{
public:
//Constructor
//
explicit
SharedPtr(T* p = NULL)
: m_ptr(p), m_count(new long(1))
{
}
SharedPtr(const SharedPtr<T>& p)
: m_ptr(p.m_ptr), m_count(p.m_count)
{
_AddRef();
}
SharedPtr<T>& operator=(const SharedPtr<T>& p)
{
if (*this != p)
{
_Release();
m_ptr = p.m_ptr;
m_count = p.m_count;
_AddRef();
}
return *this;
};
//operator
//
T& operator*() const
{
return *m_ptr;
}
T* operator->() const
{
return m_ptr;
}
operator bool() const
{
return (m_ptr != 0);
}
bool operator ==(const SharedPtr<T>& p) const
{
return m_ptr == p.m_ptr;
}
bool operator !=(const SharedPtr<T>& p) const
{
return m_ptr != p.m_ptr;
}
//Get pointer
//
T* GetInternalPtr()
{
return m_ptr;
}
//Deconstructor
//
~SharedPtr()
{
_Release();
}
public:
//Add reference
//
long _AddRef()
{
return m_count ? ++(*m_count) : 0;
}
//Release the object
//
long _Release()
{
if (m_count == NULL)	return 0;
long nRef = --(*m_count);
if (nRef == 0)
{
delete m_ptr;
delete m_count;
m_ptr = 0;
m_count = 0;
}
return nRef;
}
private:
//Data
//
T*		m_ptr;	//shared ptr
long*	m_count;//ptr count
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: