C++里有一个智能指针类,不过那个类没有计数功能,下面智能指针类可以计数,直到计数为0才能删掉,此类还可以对数组进行管理,也许对你有用呢!
/****************************************************
** Copyright (C) 2006 - 2007
** 功 能: 采用模板实现一个智能化的记数指针
** 指针可以初始化为空,但此时调用
** 指针操作符会抛出异常,而且指针只能初始化一遍
** 如果采用相同的new 生成对象初始化不同SmartPointer
** 这也导致抛出异常,因为这样一来后一个指针将会
** 指向一个无效区域
** 文件名称: SmartPointer.h
** 文件基类:
** 扩 展 名: .h
** 创建日期: 2006-04-01
** 作 者: Rohna.w
*****************************************************/
#ifndef _SMART_POINTER_ONCE_
#define _SMART_POINTER_ONCE_
template <class T>
class SmartPtr
{
public:
/********************************************
* 功 能:默认构造函数
* 参 数:无
* 返回值:无
*********************************************/
explicit SmartPtr() : smtPtr(0),lCount(0),lDims(0)
{
}
explicit SmartPtr(T *ptr) : smtPtr(ptr),lDims(0)
{
if(ptr != NULL)
{
lCount = new long(1);
}
}
explicit SmartPtr(T *ptr,long dims)// : lCount(new long(1)),smtPtr(ptr),lDims(dims)
{
if(ptr != NULL && dims > 0)
{
smtPtr = ptr;
lCount = new long(1);
lDims = dims;
}
}
SmartPtr(const SmartPtr<T> &ptr)
{
smtPtr = ptr.smtPtr;
lCount = ptr.lCount;
lDims = ptr.lDims;
// 防止赋空指针
if(smtPtr)
{
(*lCount)++;
}
}
SmartPtr<T>& operator=(const SmartPtr<T> &ptr)
{
if(this != &ptr)
{
Destroy();
smtPtr = ptr.smtPtr;
lCount = ptr.lCount;
lDims = ptr.lDims;
// 防止赋空指针
if(smtPtr)
{
(*lCount)++;
}
}
return *this;
}
bool Attach(T *ptr,long dims=0)
{
if(ptr != smtPtr)
{
Destroy();
lCount = new long(1);
smtPtr = ptr;
lDims = dims;
ptr = 0;
}
return true;
}
long Dimension() const
{
return lDims;
}
T const* GetData() const
{
return (T const*)smtPtr;
}
T& operator [] (int nIndex) const
{
if(nIndex < 0 || nIndex >= lDims) throw;
return smtPtr[nIndex];
}
bool operator == (const SmartPtr<T> &ptr) const
{
return ptr.smtPtr == this->smtPtr;
}
bool operator < (const SmartPtr<T> &ptr) const
{
return this->smtPtr < ptr.smtPtr;
}
bool operator ! () const
{
if(smtPtr == 0)
{
return true;
}
return false;
}
operator T* () const
{
return smtPtr;
}
T& operator * () const
{
return *smtPtr;
}
T* operator -> () const
{
return smtPtr;
}
virtual ~SmartPtr()
{
Destroy();
}
private:
void Destroy()
{
if(smtPtr == 0)
{
lCount = NULL;
lDims = 0;
return;
}
(*lCount)--;
if(0 == *lCount)
{
if(lDims > 0) delete[] smtPtr;
else delete smtPtr;
delete lCount;
}
smtPtr = NULL;
lDims = 0;
lCount = NULL;
}
private:
long *lCount; // 被管理指针的引用计数,为0时释放掉指针
T *smtPtr; // 管理的指针
long lDims; // 数组元素个数
};
#endif