一个COM对象的COM接口的dynamic_cast不凸点的引用计数,是吗?(dynamic_cas

2019-07-19 00:52发布

如果我有一个C ++类,X,它实现了COM接口IY和IZ,我有一个指针y以X类型的对象的IY接口,并且我这样做:

IZ *z = dynamic_cast<IZ *> ( y );

这并不撞击对象的引用计数,不是吗? 我没有做一个版本()考虑到,对不对?

如果它的事项,我使用ATL / COM。

我猜的答案是“没有也碰到引用计数,并没有你不必释放()”,但我想确认一下。

提前致谢。

Answer 1:

当有人呼叫的IUnknown ::的AddRef()为COM对象的引用计数递增。 的QueryInterface(),根据COM规则,因为它给出了一个新的接口指针,内部调用的AddRef()。

在您发布的代码,你不调用的AddRef(),和你不打电话,可能调用的AddRef()的任何功能,那么,为什么你认为引用计数将递增?

尽管什么ATL / MFC做一个人的大脑,没有介入的法宝。 如果有疑问,可以随时查看VS拆卸,并通过它一步并证明自己,的AddRef()不会被调用。

编辑:我想重申Dewfy说, 不这样做 。 使用的QueryInterface()。 或CComQIPtr <>(如果你必须)。

进一步编辑:如果您使用但是CComPtr <>和CComQIPtr <>,那么你不必调用Release()和很多找出正确的裁判计数的负担减轻。 你真的应该考虑使用它们。



Answer 2:

dynamic_cast的不得在多种原因被使用:

  • 你不知道,如果目标支持RTTI
  • 你不知道,如果OLE不会为你创建代理
  • ...

而是使用的QueryInterface - 它会做你想要什么。

即使你在上面的问题肯定 - 铸造不会改变refcounter



Answer 3:

在C ++ Builder中, dynamic_cast上的COM接口指针实际上做QueryInterface 。 并且返回的指针,如果QI成功,得到AddRef “d。

它实现COM对象的类有不同的虚函数表布局,以更一般的C ++类,所以C ++ -风格dynamic_cast不能工作; 所以我想这也是为什么C ++ Builder中确实做的QueryInterface的更明智的事情。

(COM的最初的想法是概括C ++对象模型为与语言无关,为二进制标准;它们更名的dynamic_cast到的QueryInterface)。

我猜顶答案指的是MSVC,如果将dynamic_cast会导致不确定的行为。



文章来源: dynamic_cast of a COM object to a COM interface doesn't bump the reference count, does it?