内存分配规则摘要
下表汇总了有关内存分配的关键规则。
MIDL 元素 | 说明 |
---|---|
顶级 [ ref] 指针 | 必须是非 null 指针。 |
函数返回值 | 始终为指针返回值分配新内存。 |
[ unique, out] 或 [ ptr, out] pointer | MIDL 不允许。 |
从 null 更改为非 null 的非顶级 [unique, in, out] 或 [ptr, in, out] 指针 | 客户端存根在返回时在客户端上分配新内存。 |
从非 null 更改为 null 的非顶级 [unique, in, out] 指针 | 客户端上的内存是孤立的;客户端应用程序负责释放内存和防止泄漏。 |
从非 null 更改为 null 的非顶级 [ptr, in, out] 指针 | 如果未使用别名,客户端上的内存将孤立;在这种情况下,客户端应用程序负责释放和防止内存泄漏。 |
[ref] 指针 | 客户端应用程序层通常分配。 |
非 null [in, out] 指针 | 存根尝试写入客户端上的现有存储。 如果 [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].) |