【问题标题】:COM ownership with composition in interfacesCOM 所有权与接口中的组合
【发布时间】:2015-10-11 14:41:42
【问题描述】:

如果 COM 接口拥有其他接口,它是否必须覆盖 AddRefRelease

在创建接口时,会创建维护 refcount 的成员,因此我必须覆盖 Release 以免在自己的 refcount 达到零时泄漏拥有的接口。

但是 AddRef 呢?当只是对拥有的接口进行浅拷贝时,似乎一切都会好起来的。它们可能在拥有接口下方有一个引用计数,但当所有者未达到零时,它们永远不会达到零。

这种情况的一个例子是IDirect3DTexture9 在每个纹理级别拥有许多IDirect3DSurface9

【问题讨论】:

  • 这里的“拥有”是什么意思?当调用者获得接口上的指针(使用任何方法、QueryInterface 或其他方法)时,方法被调用者生成了一个 AddRef。当调用者不再需要接口指针时,它会调用 Release。这就是关于 COM 的全部内容。调用者不使用 AddRef 或 Release 返回值。
  • @SimonMourier 在我的示例中,创建父/所有者时会创建子/拥有接口。如果调用者只是释放了创建的接口,那么子/拥有的接口也应该被释放。
  • 这取决于库作者的设计决定。有时“父”拥有(添加引用)子,有时“子”添加引用父,有时两者兼而有之。
  • “both”的例子,是老式的 DAO,父母拥有孩子,孩子拥有父母。 “父拥有”的示例是 ADO 记录集拥有字段。 “child addrefs”的示例是 ADO Recordset addrefs Connection。
  • @typ1232 无论父母做什么都是父母的责任。如果它使用和分配资源(任何类型,而不仅仅是其他 COM 对象),它应该将这些资源的责任委派出去,或者在不再需要时释放它们,通常通过Release 释放。

标签: com composition ownership


【解决方案1】:

没有。

资源应该在析构函数中释放,或者如果您使用智能指针字段,则自动释放。我假设您使用的是 C++。

因此,实际上,内部接口指针的引用计数可能低于外部接口指针。

除了外部指针向内部指针的引用计数计数 1 之外,引用计数在其他方面是完全独立的。

【讨论】:

    猜你喜欢
    • 2018-12-21
    • 1970-01-01
    • 2016-01-05
    • 2016-01-05
    • 1970-01-01
    • 2014-06-28
    • 2018-08-13
    • 2010-12-17
    • 2021-10-07
    相关资源
    最近更新 更多