使用智能指针的危险
来源:互联网 发布:防蓝光软件下载 编辑:程序博客网 时间: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()方法是不一样的。
- 使用智能指针的危险
- 智能指针的使用
- 智能指针的使用
- 智能指针的使用
- 智能指针的使用
- 指针的危险
- 指针的危险
- 指针的危险
- 智能指针 _com_ptr_t的使用
- C++ 智能指针的使用
- 智能指针auto_ptr的使用
- ADO智能指针的使用
- C++ 智能指针的使用
- c++智能指针的使用
- C++智能指针的使用
- 使用智能指针的注意事项
- 指针(4)智能指针的使用
- vtk智能指针->对智能指针的理解和使用
- 用JAVA程序解决鬼谷子数学问题
- 英特尔3-D三栅极晶体管设计被美媒体评为2011年度科技创新奖
- c语言 状态机
- double 精度问题
- MyEclipse8.6反编译插件jad安装
- 使用智能指针的危险
- NYOJ 138 找球号 简单的离散+简单的哈希思想
- 正则表达式对象
- Java基础: HashSet 与 hashCode、equals
- 查找字符串之boyer-moore算法
- IOS4的多任务机制概述
- OpenLayers深入浅出(5)----地图全屏样式设置
- 子网划分的两个例子
- RHEL6.1配置本地源以及VMTools的安装