使用智能指针的危险

 

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()方法是不一样的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值