allocate 属性
[allocate] ACF 属性允许自定义 IDL 文件中定义的类型的内存分配和解除分配。
typedef [allocate (allocate-option-list) [, type-attribute-list] ] type-name;
-
allocate-option-list
-
指定一个或多个内存分配选项。 选择 single_node 或 all_nodes之一,或 免费 或 dont_free之一,或从每对中选择一个。 指定多个选项时,请用逗号分隔选项。
-
type-attribute-list
-
指定其他可选的 ACF 类型属性。 指定多个类型属性时,请用逗号分隔选项。
-
type-name
-
指定 IDL 文件中定义的类型。
[allocate] 属性具有以下有效选项。
选项 | 说明 |
---|---|
all_nodes | 调用一次以为所有节点分配和释放内存。 |
single_node | 进行多个单独调用来分配和释放每个内存节点。 |
free | 从服务器存根返回时释放内存。 |
dont_free | 从服务器存根返回时不释放内存。 |
默认情况下,存根可以通过调用midl_user_allocate为唯一指针或完整指针引用的数据分配存储 , 并为每个指针单独 midl_user_free 。
可以通过指定 all_nodes 选项来优化应用程序的速度。 此选项指示存根计算通过指定类型的指针引用的所有内存的大小,并单个调用 midl_user_allocate。 存根通过调用 midl_user_free来释放内存。
dont_free 选项指示 MIDL 编译器生成不调用指定类型的midl_user_free的服务器存根。 dont_free 选项允许在远程过程调用完成并返回到客户端后,服务器应用程序仍可访问指针结构。
[allocate] 属性将导致任何 [in, out] 参数,该参数是指向使用 all_nodes 选项限定的类型的指针,以在数据取消封存时重新分配内存。 应用程序负责释放以前为此参数分配的内存。 例如:
typedef struct thistype
{
[string] char * PTHISTYPE;
} * PTHISTYPE
HRESULT proc1 ( [in,out] PTHISTYPE * ppthistype);
在取消封存之前,存根将以 [out] 方向重新分配数据类型 PTHISTYPE。 因此,应用程序必须释放之前为此参数的数据分配的内存,否则会发生内存泄漏。
/* ACF file */
typedef [allocate(all_nodes, dont_free)] PTYPE1;
typedef [allocate(all_nodes)] PTYPE2;
typedef [allocate(dont_free)] PTYPE3;