内存分配规则摘要

下表汇总了有关内存分配的关键规则。

MIDL 元素 说明
顶级 [ ref] 指针 必须是非 null 指针。
函数返回值 始终为指针返回值分配新内存。
[ uniqueout] 或 [ ptr, out] pointer MIDL 不允许。
从 null 更改为非 null 的非顶级 [uniqueinout] 或 [ptr, in, out] 指针 客户端存根在返回时在客户端上分配新内存。
从非 null 更改为 null 的非顶级 [uniqueinout] 指针 客户端上的内存是孤立的;客户端应用程序负责释放内存和防止泄漏。
从非 null 更改为 null 的非顶级 [ptrinout] 指针 如果未使用别名,客户端上的内存将孤立;在这种情况下,客户端应用程序负责释放和防止内存泄漏。
[ref] 指针 客户端应用程序层通常分配。
非 null [inout] 指针 存根尝试写入客户端上的现有存储。 如果 [string] 和 大小超出客户端上分配的大小,则会导致返回时出现 GP 错误。

 

下表总结了密钥 IDL 和 ACF 属性对内存管理的影响。

MIDL 功能 客户端问题 服务器问题
[ allocate (single_node) ], [allocate (all_nodes) ] 确定是对内存函数进行一次还是多次调用。 与客户端相同,但专用内存通常用于分配 (single_node) [in] 和 [in,out] 数据。
[分配 (免费) ] 或 [分配 (dont_free) ] (None;影响 server.) 确定在每次远程过程调用后是否释放服务器上的内存。
数组属性 [ max_is] 和 [ size_is] (None;影响 server.) 确定要分配的内存大小。
[ byte_count] 客户端必须分配缓冲区;未由客户端存根分配或释放。 ACF 参数属性确定服务器上分配的缓冲区的大小。
[ enable_allocate] 通常,没有。 但是,客户端可能使用不同的内存管理环境。 服务器使用不同的内存管理环境。 RpcSmAllocate 应用于分配。
[ in]attribute 负责为数据分配内存的客户端应用程序。 由存根在服务器上分配。
[ out] 属性 由存根在客户端上分配。 [out]-only 指针必须是 [ref] 指针;由存根在服务器上分配。
[ ref] 属性 指针引用的内存必须由客户端应用程序分配。 由存根管理的顶级和第一级引用指针。
[ unique] 属性 非 null 到 null 可能会导致孤立内存;null 到非 null 会导致客户端存根调用 midl_user_allocate (影响 client.)
[ ptr] 属性 (请参阅 [ unique].) (请参阅 [ unique].)