COM本质论说:AddRef的调用一定要用特定的接口。就是说有IUnknown接口,以及通过它查询到得接口IA,IB等,如果IUnknown,IA,IB要AddRef的话一定要分别pIUnknown->AddRef,pIA->AddRef,pIB->AddRef(),但是我怎么觉得随便用哪个都可以,即使是pIA->AddRef也可以用pIUnknown->AddRef(),因为本质上那个引用计数的变量是在CUnknownImpl中的啊?大家帮我解答一下?还有怎么产看CUnknownImpl的源码呢

解决方案 »

  1.   

    引用计数,主要是维护类生命周期的,因为类可能继承了不同的接口,所以对使用接口的人来说,正确的AddRef, Release是对接口作用域的控制,对类来说,是控制了其生命周期。当Release后计数为0,也就意味时该类生命周期结束,可以delete释放资源了。
    一般在查询获取接口时,返回前都帮你AddRef了(接口存在的情况下),因此当你不再需要这个接口时,要自己调用Release,从而维持正确的引用计数。
    这里有比较好的文章入门:http://www.vckbase.com/vckbase/columnist/yangfeng/
      

  2.   

    IB应用了IA的接口, 就要IA->Addref,这样IA知道,它被别人引用了接口,需要别人Release释放了,它才能释放
      

  3.   

    对于同一个对象,没有使用聚合的话,你的理解是对的,其实调用的就是同一个函数而已,从这个角度讲无所谓用那个指针.
    但是如果使用聚合的话,AddRef函数调用就不一样了.这里主要说的是一种习惯,调用规范.方便代码阅读.尤其是在实际的项目开发中,少出错误