有效的使用和设计COM智能指针——条款19:在接口完满的前提下使之最小化。

26 篇文章 0 订阅
25 篇文章 1 订阅

条款19:在接口完满的前提下使之最小化。

更多条款请前往原文出处:http://blog.csdn.net/liuchang5

通过智能指针,如果我们需要提前结束一个COM组件的生命周期。则需要尽可能早的手动递减其引用计数。

CComPtr<IInterface> spInterface = pInterface ;
...
spInterface.Release();  //这样做提前释放掉引用计数,可以缩短COM的生命周期。
//spInterface = NULL; 这一句和上一句等价。
...
spInterface = pOtherInterface;

但让人疑惑的是无论是在CComPtr中,或者是在_com_ptr_t中,都会存在两种提前释放资源的方法:

1.通过智能指针提供的Release()成员函数。

2.将其赋值为NULL,如上例可以写成:spInterface=NULL

那你不禁会问:“这两种方法区别在哪里呢?是不是他们确实产生了某种区别,而我不知道?”这样的接口确实让人觉得有些疑惑,当你千方百计想弄清楚里面究竟发生了什么的时候你可能耽误了大量的时间,而换来的答案确是“没有区别!”。这着实让人失望。

那既然没有区别,而=NULL的语法是不是更加使得这个资源管理对象形式上像一个指针呢?

而我对于这一问题的看法是:“如果能在保证接口完满的前提下,应当尽可能使接口指最小化。”根据这一原则,Release()应该是个多余的产品。

我们试着将Release()去掉,再来审视一下这套接口。看他是否满足我之前的假设:

1.接口是完满的,没有因为缺少Release()就失去了提前释放资源的功能。他完全可以由=NULL来代替。

2.接口是最小的,有了=NULL,我们似乎没有必要再附加一个Release功能来完成资源的提前释放。

去掉Rlease(),接口就完满且最小了。这个议题本应该结束了。但为满足部分人的好奇心,请允许我还是再花一部分篇幅,讨论一下Rlease()存在的原因。

~可能我们又要回到历史这个话题上来。

如果你还有印象我们“条款1”中,用大量的文字讲述了智能指针产生的原因和演变的过程。你可能还记得,他在“幼年”之时还叫做“资源管理对象”。在当时,程序员若想提前释放掉资源,则会设计一个形如Release()的成员函数完成这一功能,这种名称很贴切形容了这一功能,因此约定也持续了很长时间。

而当“资源管理对象”成长为“智能指针”之后,=NULL的功能可以替代原先的Release()了。但是部分程序员仍然习惯以Release()的方式释放资源。这样就造成了Rlease()=NULL两种资源释放方式同时存在的情况。

若你能将智能指针看作一个“资源管理对象”,那么使用Release()而不是=NULL来释放资源显然是符合其语义的。若你仍然将其视为一个“指针”,那么=NULL将更加类似于一个普通指针的行为。

如此一来,疑问都消除了吧?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值