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