【发布时间】:2015-10-11 14:41:42
【问题描述】:
如果 COM 接口拥有其他接口,它是否必须覆盖 AddRef 和 Release?
在创建接口时,会创建维护 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