COM接口指针很危险,因为使用过程中需要每一个使用者都要严格并且正确的AddRef和Release,一旦出现问题,就会造成对象不能被正常释放,或者对象被重复删除,造成程序崩溃。所以使用COM接口,必须小心翼翼才行。
但是,即使所有的代码中,都正确的AddRef和Release,也不一定能保证万无一失,例如:
void SomeApp( IHello * pHello )
{
IHello* pCopy = pHello;
pCopy->AddRef();
OtherApp();
pCopy->Hello();
pCopy->Release();
}
看起来好像无懈可击,但是假设OtherApp中抛出了异常,那么pCopy->Release不就被跳过去了吗?
幸好,所有的问题都从简单到复杂,再从复杂到简单的,因为我们有CComPtr!

CComPtr被称为智能指针,是ATL提供的一个模版类,能够从语法上自动完成AddRef和Release。(源代码在atlbase.h中)
CComPtr的用法很简单,以IHello*为例,将程序中所有接口指针类型(除了参数),都使用CComPtr<IHello> 代替即可。即程序中除了参数之外,再也不要使用IHello*,全部以CComPtr<IHello>代替。
CComPtr的用法和普通COM指针几乎一样,另外使用中有以下几点需要注意。
1. CComPtr已经保证了AddRef和Release的正确调用,所以不需要,也不能够再调用AddRef和Release。
2. 如果要释放一个智能指针,直接给它赋NULL值即可。(这一点要牢记曾因为没有设置为null而出错)
3. CComPtr本身析构的时候会释放COM指针。
4. 当对CComPtr使用&运算符(取指针地址)的时候,要确保CComPtr为NUL。(因为通过CComPtr的地址对CComPtr赋值时,不会自动调用AddRef,若不为NULL,则前面的指针不能释放,CComPtr会使用assert报警)
以刚才的程序为例:
void SomeApp( IHello * pHello )
{
CComPtr<IHello> pCopy = pHello;
OtherApp();
pCopy->Hello();
}
由于pCopy是一个局部的对象,所以即使OtherApp()抛出异常,pCopy也会被析构,指针能够被释放。
如果不想在程序临近发布前,还因为COM指针的引用计数造成崩溃的话,就牢记这一点吧:程序中除了参数之外,不要直接使用COM指针类型,一定要全部以CComPtr<IXXX>代替。

用CComPtr吧,COM接口指针很危险相关推荐

  1. c语言指针很危险,浅谈C语言中指针使用不当的危险性.doc

    浅谈C语言中指针使用不当的危险性.doc 第 19 卷 Vol . 19 第 2 期 No . 2 洛阳师专学报 Journal of Luoyang Teachers College 2000 年 ...

  2. 你必须知道的指针基础-3.指针的移动及指针的危险

    一.指针的移动 1.1 指针的向前及向后移动 指针每次加一就是指针向前移动指针类型对应的字节数.下面通过一个int指针来指向一个int数组,看看指针的加法运算到底是个什么鬼? int nums[]={ ...

  3. linux中高危端口,端口随意开很危险 常见端口解析

    端口随意开很危险 常见端口解析 [日期:2007-07-14] 来源:Linux公社 作者:Linuxidc [字体:大 中 小] 113端口:113端口主要用于Windows的"Authe ...

  4. 《从缺陷中学习C/C++》——6.15 试图产生的指针很可能不存在

    本节书摘来自异步社区出版社<从缺陷中学习C/C++>一书中的第6章,第6.15节,作者: 刘新浙 , 刘玲 , 王超 , 李敬娜 , ,更多章节内容可以访问云栖社区"异步社区&q ...

  5. 【长篇连载】桌面管理演义 第八回 电脑中毒很危险 告警隔离防传染

    上回书我们说到,电脑菜鸟老李在桌管系统的帮助下,完善了桌面设置,打了补丁.更新了病毒库,并遵守公司的规章制度,电脑一直安然无恙,半年了也没再求助过IT部门.这让电脑高手小王很是看不下去,想我小王纵横I ...

  6. COM中的IDL语言的难点之接口指针

    IDL前置声明语法:: SOLVED Add a forward declaration - at the TOP of IDL file: import "ocidl.idl"; ...

  7. 企业过快移向MBaaS很危险

    据位于康涅狄格州斯坦福德市的IT研究机构Gartner调查,至2016年,移动应用开发的40%将会使用去移动后端即服务(MBaaS).技术.成本节约和移动开发云后端即服务易用的改进提升了采用的速度,但 ...

  8. ai背景合成_智能合成AI主播很危险,应立即取消!

    邱震海分享我对时政问题的看法 点击↑↑↑音频收听"倾听彼得 · 邱" 音频背景 每年两会,关注报道两会的记者多达3000多人,他们分布在会场内外及时捕捉两会动人瞬间和重要时刻,及时 ...

  9. java中result方法_java.sql.resultSet接口中有很多方法的实现

    接口是很重要的面向对象方式,继承接口的类不用全部实现定义的接口,可以这么说,我定义了好多接口,某个类可以这么实现这个接口,到另一个类你又想那么实现接口,都是可以的. 或者定义完接口不想管他都可以,虽然 ...

最新文章

  1. java gui 窗口 传值_java – GUI – 在不同窗口之间传输数据(J...
  2. 阿里云CentOS7安装Oracle11GR2
  3. 网易云以场景化云服务力拓教育行业
  4. 给Domino系统管理员的十二项建议
  5. 马云贾跃亭唯一一次公开对话:一个曾经被嘲笑 一个现在被嘲笑
  6. Oracle数据库安装教程
  7. kali linux mysql密码,Kali Linux中MySQL重置root密码
  8. Hive基础04、Hive建表语句详解
  9. 图像边缘检测的新方向——量子算法
  10. html+浏览器自动全屏,web 使网站在浏览器中全屏显示 fullscreen=yes
  11. 【多传感器融合理论】01自动驾驶中常用传感器硬件介绍
  12. 从入门到入土:Python实现爬取网易云歌词|评论生成词云图
  13. Typora加超链接实现页内跳转的三种方法
  14. 越来越喜欢SQL语法了,Linq什么时候出来啊,半年了,咋没见更新了呢!真是望眼欲穿。...
  15. java做节奏大师,节奏大师:音浪太强太迷茫?做到这些轻轻松松成为“节奏大师”...
  16. 案例解读 | 拯救“中年危机”:星巴克的新零售之道
  17. tplink478虚拟服务器设置,tp-link路由器TL-R473如何设置,10台电脑设置局域网
  18. 如何批量下载天堂图片网上多个精美作品并保存一个目录
  19. 分析与设计:图书管理系统
  20. linux系统配置X11

热门文章

  1. 控制元素显示和隐藏的方式及区别、内容溢出处理(区域滚动)、透明性、字体图标、常见字体、自定义字体设计、网站图标、CSS代码分析
  2. 2020盲盒经济洞察报告
  3. 爬虫项目之豆瓣电影排行榜前10页
  4. 最大子序和(Leetcode第53题)
  5. 不属于html5表单元素的是,HTML5 表单元素
  6. python 获取li的内容_Python开发案例:爬取四川省统计局数据Matplotlib绘图
  7. 专题导读:大数据整理
  8. 【计算机科学基础】图灵机原理概述
  9. 【数据结构与算法】非森林版并查集V2.1的Java实现
  10. 质因子分解(洛谷P2043题题解,Java语言描述)