有效的使用和设计COM智能指针-前言
前言
自从1993年Microsoft首次公布了COM技术以后,Windows平台上的开发模式发生了巨大的变化,以COM为基础的一系列软件组件化技术将Windows编程带入了组件化时代。直至如今,COM技术仍然焕发着旺盛的生命力,大量组件和软件都通过COM技术实现了复用和资源共享。
由于技术复杂,COM编程一度被视为一种高不可攀的技术,令人望而却步。COM将Windows推向组件化时代的同时,也将开发和使用COM组件的程序员推上了另外一座危险的山峰。那里高不可攀,四处潜藏着陷阱与玄机,稍有不慎便会摔得粉身碎骨。
现在,设想你已经站到了COM为你隆起的山峰上。四面是悬崖峭壁,若是一步不小心,就将滑落到谷底深渊,命悬一线。我若是此时给你一顶降落伞背在身后,我想你肯定不会拒绝。
而COM接口的智能指针,正是解决COM技术中引用计数问题的一顶“降落伞”。虽然他不能保证你不会摔下悬崖,但总不至于摔死得很难看。
或许很多人拒绝使用COM接口智能指针的原因和拒绝使用“降落伞”是一样的:
1.你需要学习正确使用它的方法。(如你得知道什么时候打开你的降落伞);
2.你需要避免它带来的负面影响,避免它引入的新的风险。(你得知道你拉开降落伞后如何不被挂在树上,或者不被大风吹打到另一堵悬崖上);
明白了这些以后我想你还是愿意选择使用智能指针来代替原始的手动引用计数。若是你比较执着的认为原始的手动操作引用计数更加能使得代码清晰明确的话。那么你可能要遭受来自“异常安全”、“类型安全”等问题的困扰。更为遗憾的是,手动计数,并不会是代码更加清晰。在本文的第一章你将会看到这些内容。
我曾经听人说:“不要使用智能指针,因为有时候搞不清他是智能指针还是接口指针。”这种想法确实相当有道理,因为我们希望程序尽可能的清晰易懂。而智能指针会隐藏很多实现细节。对于不熟悉他的人来说,你可能并不知道他在某一时刻所做的某种“智能化”操作。但如果通过本文,你能够清楚这些实现细节,并有针对性的采取相应的解决办法。似乎会比直接拒绝使用它有价值得多。
本文主要想讨论的问题是智能指针的使用和设计。我们讨论智能指针处理某些问题的做法,并尽可能的解析出之所以这样做的一些历史的、平台的背景,以及他所遵守的某种设计上的原则。并从中挖掘出可以指导我们将来设计的一些指导思想,我将这些思想以章节和条款的形式组织在一起。
第一章中,你将能够对COM接口智能指针的使用有个粗略的了解。并从中明白智能指针使用时候需要遵守的一些条款和规则。
第二章中,我们讨论,智能指针在使用规则上的若干问题。告诉你如何正确的使用智能指针而不沦落到内存和资源泄漏的困境中。
第三章中,我们讨论设计一套智能指针所需要遵循的原则,并且在矛盾发生时如何在这些原则中进行取舍。
第四章中,我们讨论具体实现中的细节,他会具体到一个接口应该如何编写,如何通过一些技巧让设计出来的接口不易被误用,以及智能指针编写过程中的各种细节。
最后一章,是关于一些遗留下来的杂项的讨论。这些东西往往是有争议的,因此有些智能指针的设计者会采用它,而有的则不会。我们以一个中立的态度看待这些问题,并给出乡音的解决方案。
通过这篇文档,我尽量挖掘智能指针背后所隐藏的一些问题,从而使得我们可以更加有效的使用和正确的设计出适合自己项目的COM智能指针。为了举例论证某些观点,我编写了大量的示例(部分示例改编自其他论文,我在相应的地方著名了出处)。我对这些示例中产生的问题和原因逐一的剖析,希望读完之后读者能有豁然开朗的效果。
由于编者水平有限,本文诸多地方可能还存在着错误。还望读者多多指正。
作者“liuchang5的专栏”
补充:软件开发 , C语言 ,