使用智能指针的危险

来源:互联网 发布:防蓝光软件下载 编辑:程序博客网 时间:2024/05/02 14:53
 

1:使用智能指针的危险

案例一

HRESULT hr = S_OK;

CDownloadFileResults *pResult = NULL;

CComPtr<CDownloadFileResults> spInst;

hr = FSCreateObject(&spInst);

CHECK_RET(hr);

pResult = spInst;

spInst.Release();

// Release后pResult的指针p值没有改变,但是p值所指向的空间被释放

if(pResult!=NULL)

  pResult->doNothing();//由于空间已释放,所以这样使用就会造成崩溃

 

案例二

HRESULT hr = S_OK;

CDownloadFileResults *pResult = NULL;

{

  CComPtr<CDownloadFileResults> spInst;

  hr = FSCreateObject(&spInst);

  CHECK_RET(hr);

  pResult = spInst;

}//出作用域以后,智能指针析构,pResult指针地址没有改变,但内存已释放

if(pResult!=NULL)

  pResult->doNothing();//由于空间已释放,所以这样使用就会造成崩溃

 

二:多线程中,使用智能指针Release()方法要比直接对智能指针赋 NULL更加安全,在单线程中两种方法等效

  分析:

一:智能指针Release 方法:是先将指针指向NULL,然后再调用Release方法,只要我们在Release方法中保证线程安全性就OK了,

void Release() throw()

{

     T* pTemp = p;

     if (pTemp)

     {

         p = NULL;

         pTemp->Release();

     }

}

而 “智能指针赋 NULL”方式是先调用接口Release() 方法,然后再赋NULL.

这样如果在赋值为NULL之前Release之后,有另外线程再来访问该指针就会

出现危险。

 

三:使用智能指针调用.Release()与调用->Release()方法是不一样的。

原创粉丝点击