内存管理规则
指向接口的指针的生存期始终通过每个 COM 接口上的 AddRef 和 Release 方法进行管理。 有关详细信息,请参阅 管理引用计数的规则。
对于所有其他参数,请务必遵守用于管理内存的某些规则。 以下规则适用于接口方法的所有参数,包括未按值传递的返回值:
- 参数必须由调用方分配和释放。
- 外参数必须由调用的参数分配;调用方使用标准 COM 任务内存分配器释放它们。 有关详细信息,请参阅 OLE 内存分配器。
- In/out-parameters 最初由调用方分配,然后根据需要释放并重新分配调用的参数。 与 out 参数一样,调用方负责释放最终返回的值。 必须使用标准 COM 内存分配器。
在后两种情况下,一段代码分配内存,另一段代码释放内存,使用 COM 分配器可确保这两段代码使用相同的分配方法。
另一个需要特别注意的领域是处理故障条件下的出出参数。 如果函数返回失败代码,调用方通常无法清理 out 或 out 参数。 这会导致以下附加规则:
- 如果出现错误条件,参数必须始终可靠地设置为一个值,该值将被清除,而调用方无需执行任何作。
- 必须将所有 out 指针参数显式设置为 NULL。 这些通常是在指针到指针参数中传递的,但也可以作为调用方分配的结构的成员和调用的代码填充传递。 确保这是(部分)将这些值设置为函数项上的 NULL 最简单的方法。 此规则非常重要,因为它可提升更可靠的应用程序互作性。
- 在错误条件下,所有外入参数都必须由调用的代码单独保留(因此保留于调用方初始化的值)或显式设置,如 out 参数错误返回情况所示。
请记住,COM 应用程序的这些内存管理约定仅适用于公共接口和 API;完全不需要在 COM 应用程序内部严格执行内存分配,只需使用这些机制。
COM 在内部使用远程过程调用 (RPC) 在客户端和服务器之间进行通信。 有关在 RPC 服务器存根中管理内存的详细信息,请参阅 服务器存根内存管理 主题。