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