COM所有权与接口中的组合

COM所有权与接口中的组合,com,composition,ownership,Com,Composition,Ownership,如果COM接口拥有其他接口,它是否必须覆盖AddRef和Release 在接口创建时,创建了维护refcount的成员,因此我必须重写Release,以便在自己的refcount为零时不泄漏自己的接口 但是AddRef呢?当只做所拥有接口的浅拷贝时,似乎一切都会很好。它们可能在所属接口下有一个refcount,但当所有者未达到零时,它们永远不能达到零 这种情况的一个例子是IDirect3DTexture9对于每个纹理级别拥有许多IDirect3DSurface9。否 资源应该在析构函数中释放,如

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

在接口创建时,创建了维护refcount的成员,因此我必须重写
Release
,以便在自己的refcount为零时不泄漏自己的接口

但是AddRef呢?当只做所拥有接口的浅拷贝时,似乎一切都会很好。它们可能在所属接口下有一个refcount,但当所有者未达到零时,它们永远不能达到零

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

资源应该在析构函数中释放,如果使用智能指针字段,则应自动释放。我假设你使用C++。< /P> 因此,实际上,内部接口指针的引用计数可能低于外部接口指针


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

这里的“own”是什么意思?当调用者(使用任何方法、QueryInterface或其他方法)在接口上获取指针时,被调用者方法已生成AddRef。当调用方不再需要接口指针时,它调用Release。这就是所有的COM。调用方不使用AddRef或Release返回值。@SimonMourier在我的示例中,创建父/所有者时会创建子/拥有的接口。如果调用方只是释放创建的接口,那么子接口/拥有的接口也应该释放。这取决于库作者的设计决策。有时“父”拥有(addrefs)子代有时“子”拥有父代,有时两者都拥有。“两者”的例子是老式的DAO,父代拥有子代,子代拥有父代。“父拥有”的示例是ADO记录集拥有字段。“子addrefs”的示例是ADO记录集addrefs连接。@typ1232无论父项做什么都是父项的责任。如果它使用和分配资源(任何类型,而不仅仅是其他COM对象),它应该将这些资源的责任委托出去,或者在不再需要时释放它们,通常是通过
release
释放。