实现引用计数

引用计数要求处理部分类实现程序和使用该类对象的客户端。 实现类时,必须实现 AddRefRelease 方法(作为 IUnknown 接口的一部分)。 这两种方法实现起来简单如下:

  • AddRef 递增对象的内部引用计数。
  • Release 首先递减对象的内部引用计数,然后它检查引用计数是否已降至零。 如果有,这意味着再也无人使用该对象,因此 Release 函数将解除分配对象。

大多数对象的常见实现方法是只有这些方法(以及 QueryInterface)中的一个实现,该实现在所有接口之间共享,因此引用计数适用于整个对象。 但是,从客户端的角度来看,引用计数严格且显然遵循每个接口指针的概念,因此可以实现基于当前存在的接口指针通过动态构造、销毁、加载或卸载部分功能来利用此功能的对象。 这些接口俗称分离式接口

每当客户端调用返回新接口指针的方法(或 API 函数),如 QueryInterface 时,调用的方法负责通过返回的指针递增引用计数。 例如,当客户端第一次创建对象时,它会接收指向从客户端的角度来看具有 1 个引用计数的对象的接口指针。 如果客户端随后对接口指针调用 AddRef,则引用计数变为 2 个。 客户端必须对接口指针调用 Release 两次,才能删除所有对象引用。

当客户端对新接口或同一接口的第一个指针调用 QueryInterface 时,引用计数如何严格按接口指针进行的示例。 在这两种情况下,每个指针都需要客户端调用 Release 一次。 当多次请求同一接口时,COM 不需要对象返回相同的指针。 (唯一例外是查询 IUnknown,用于标识 COM 的对象。这样,对象实现就可以有效地管理资源。

线程安全也是实现 AddRefRelease 的重要问题。 有关更多信息,请参见进程、线程和单元

通过引用计数管理对象生命周期