下表汇总了有关内存分配的关键规则。
MIDL 元素 | 描述 |
---|---|
顶级 [ ref] 指针 | 必须是非 null 指针。 |
函数返回值 | 始终为指针返回值分配新内存。 |
[ 唯一、out] 或 [ptr, out] 指针 | MIDL 不允许。 |
非顶级 [唯一,,out] 或 [ptr, in, out] 指针,从 null 更改为非 null | 客户端存根在返回时在客户端上分配新内存。 |
非顶级 [唯一,中的,输出] 指针,从非 null 更改为 null | 内存在客户端上孤立;客户端应用程序负责释放内存并防止泄漏。 |
非顶级 [ptr, in, out] 指针,从非 null 更改为 null | 如果客户端上没有别名,内存将孤立;客户端应用程序负责在本例中释放和防止内存泄漏。 |
[ref] 指针 | 客户端应用程序层通常分配。 |
非 null [in, out] 指针 | 存根尝试写入客户端上的现有存储。 如果 [string] 且大小超出客户端分配的大小,则会导致 GP 错误返回。 |
下表汇总了密钥 IDL 和 ACF 属性对内存管理的影响。
MIDL 功能 | 客户端问题 | 服务器问题 |
---|---|---|
[ allocate(single_node)], [allocate(all_nodes)] | 确定是否对内存函数进行一个或多个调用。 | 与客户端相同,专用内存通常用于分配(single_node) 和 [in,out] 数据。 |
[allocate(free)] 或 [allocate(dont_free)] | (无;影响服务器。) | 确定服务器上的内存是否在每次远程过程调用后释放。 |
数组属性 [ max_is] 和 [ size_is] | (无;影响服务器。) | 确定要分配的内存大小。 |
[ byte_count] | 客户端必须分配缓冲区;客户端存根未分配或释放。 | ACF 参数属性确定服务器上分配的缓冲区的大小。 |
[ enable_allocate] | 通常,没有。 但是,客户端可能使用不同的内存管理环境。 | 服务器使用不同的内存管理环境。 RpcSmAllocate 应用于分配。 |
[ ]attribute 中的 | 负责分配数据的内存的客户端应用程序。 | 通过存根在服务器上分配。 |
[ out] 属性 | 通过存根在客户端上分配。 | [out]-only 指针必须是 [ref] 指针;通过存根在服务器上分配。 |
[ ref] 属性 | 指针引用的内存必须由客户端应用程序分配。 | 由存根管理的顶级和一级引用指针。 |
[ 唯一] 属性 | 非 null 到 null 可能会导致孤立内存;null 到非 null 会导致客户端存根调用 midl_user_allocate。 | (影响客户端。) |
[ ptr] 属性 | (见 [ 唯一].) | (见 [ 唯一].) |