最简单的智能指针实现方法

本文载自网络,其正确性还未验证!!!

需求

如果经常面对以下步骤:

CMyObject* pObj = new CMyObject; //指向单个变量的指针
pObj->DoSomething();
delete pObj;
pObj = NULL;

或者

long* pList = new long[nCount]; 指向变量数组的指针
GetList(pList);
DoSomething(pList);
delete []pList;

那么一定需要智能指针。

源代码

以下是一个智能指针封装代码,代码很简单,功能很实用。

//-指向单个变量的指针-
template
class CObjPtr
{
public:
CObjPtr (T* pT = NULL)
{
Attach(pT);
}

~CObjPtr ()
{
if(m_pPtr)
{
delete m_pPtr;
m_pPtr = NULL;
}
}

void Attach (T* pT)
{
m_pPtr = pT;
}

operator T*() const
{
return (T*)m_pPtr;
}

CObjPtr& operator= (T* pT)
{
Attach(pT);
return *this;
}

T** operator& ()
{
return m_pPtr==NULL ? NULL: &m_pPtr;
}

bool operator! () const
{
return (m_pPtr == NULL);
}

bool operator< (T* pT) const
{
return m_pPtr < pT;
}
bool operator== (T* pT) const
{
return m_pPtr == pT;
}
protected:
T* m_pPtr;
};

//-指向变量数组的指针-
template
class CObjSetPtr : public CObjPtr
{
public:
CObjSetPtr (T* pT = NULL) : CObjPtr(pT)
{
}

~CObjSetPtr ()
{
if(m_pPtr)
{
delete []m_pPtr;
m_pPtr = NULL;
}
}

CObjSetPtr & operator=(T* pT)
{
Attach(pT);
return *this;
}

T& ElementAt (int nIndex)
{
return m_pPtr[nIndex];
}
};

使用方法

 //-定义并初始化-
CObjSetPtrg> ipList = new long[10];
memset(ipList, 0, sizeof(long)*10);
*(ipList+0) = 10; //-指针-
ipList[1] = 20; //-取值-
GetValueSet(ipList[) //-函数调用 short GetValueSet(long* pList)-

//-先定义,后引用-
long* pList1 = new long[10];
CObjSetPtrg> ipList1;
ipList1 = pList1;
ipList1.Attach(pList1);//或者
g>g>

优缺点

优点:灵活性,简单

特点 说明
适合各种类型 模板的功能
不用担心释放 废话,基本功能
适合指向单个或数组的指针 分开使用:CObjPtr单个;CObjSetPtr数组
最像原生态指针      凡是需要传递指针的地方都可以直接使用智能指针变量替换;用法和原生态指针一样。可以假想智能指针变量就是一个原生指针。
     操作符重载功能
     t style="" size="2">说明:CObjSetPtr继承于CObjPtr时,没有重载operator=,以为基类已经重载之,可以直接继承;结果发现 先定义后引用智能指针时总是死。每次调试断点打在基类的operator=()函数内部,结果却总是执行Copy Construction。原来=操作符是基于每个最外层类的,继承无效。 t>

也有缺点,其实应该叫做适用范围。

  1. 使用局限:
  2. 一个智能 指针变量不要指向两个指针,每个指针对应一个变量
  3. 两个智能指针变量不要指向同一个指针,一个就一个,到处使用
  4. 智能指 针变量绝不要用作函数的参数,即便引用可以,但是也不要。清洁无污染。

扩展:

智能指针可以看做一个模式。凡是生命期有限,成双成对出现的操作,都可以采用此种方式。继承一个,改写一下析构函数而已。

主要是借助于类的析构函数一定会在生命周期结束时调用

类似的有new/delete addref/release openfile/closefile openconnection/closeconnection

 

 

 

 

[email protected] 日记写到200907120011

你可能感兴趣的:(CPP)