#define DbgPrint(...) printf(__VA_ARGS__)
#define DbgEnter() {DbgPrint("+%s/n",__FUNCSIG__);DbgPrint("+pointer_=0x%x,refcount_=0x%x,*refcount_=0x%x/n",pointer_,refcount_,refcount_==0?0:*refcount_);}
#define DbgLeave() {DbgPrint("+pointer_=0x%x,refcount_=0x%x,*refcount_=0x%x/n",pointer_,refcount_,refcount_==0?0:*refcount_);DbgPrint("-%s/n",__FUNCSIG__);}
//带引用计数的智能指针
template<typename T>
class XSharedPointer
{
public:
XSharedPointer();
XSharedPointer(T* t);
XSharedPointer(const XSharedPointer<T>& t);
virtual ~XSharedPointer();
T& operator*();
T* operator->();
XSharedPointer<T>& operator=(const XSharedPointer<T>& t);
XSharedPointer<T>& operator=(const T* t);
void clear();
protected:
private:
T* pointer_;
unsigned int* refcount_;
};
template<typename T>
XSharedPointer<T>::XSharedPointer():refcount_(0),pointer_(0)
{
DbgEnter();
pointer_=0;
refcount_=0;
DbgLeave();
}
template<typename T>
XSharedPointer<T>::XSharedPointer(T* t):refcount_(0),pointer_(0)
{
DbgEnter();
pointer_=t;
if (t!=0)
{
refcount_=new unsigned int(1);
}
else
{
refcount_=0;
}
DbgLeave();
}
template<typename T>
XSharedPointer<T>::XSharedPointer(const XSharedPointer<T>& t):refcount_(0),pointer_(0)
{
DbgEnter();
pointer_=t.pointer_;
refcount_=t.refcount_;
if (refcount_!=0)
{
(*refcount_)++;
}
DbgLeave();
}
template<typename T>
XSharedPointer<T>::~XSharedPointer()
{
DbgEnter();
//引用计数-1;若==1则删除指针
if (refcount_!=0&&(*refcount_)--==1)
{
delete pointer_;
delete refcount_;
pointer_=0;
refcount_=0;
}
DbgLeave();
}
template<typename T>
T& XSharedPointer<T>::operator *()
{
DbgEnter();
DbgLeave();
return *pointer_;
}
template<typename T>
T* XSharedPointer<T>::operator ->()
{
DbgEnter();
DbgLeave();
return pointer_;
}
template<typename T>
XSharedPointer<T>& XSharedPointer<T>::operator=(const XSharedPointer<T>& t)
{
DbgEnter();
if (&t==this)
{
return *this;
}
if (refcount_!=0&&(*refcount_)--==1)
{
delete pointer_;
delete refcount_;
pointer_=0;
refcount_=0;
}
refcount_=t.refcount_;
if (refcount_!=0)
{
(*refcount_)++;
}
pointer_=t.pointer_;
DbgLeave();
return *this;
}
template<typename T>
XSharedPointer<T>& XSharedPointer<T>::operator =(const T* t)
{
DbgEnter();
if (refcount_!=0&&(*refcount_)--==1)
{
delete pointer_;
delete refcount_;
pointer_=0;
refcount_=0;
}
refcount_=new int(1);
pointer_=t;
DbgLeave();
return *this;
}
/* 清除共享指针 */
template<typename T>
void XSharedPointer<T>::clear()
{
DbgEnter();
if (refcount_!=0&&(*refcount_)--==1)
{
delete pointer_;
delete refcount_;
}
pointer_=0;
refcount_=0;
DbgLeave();
}