typedef [allocate (allocate-option-list) [, type-attribute-list] ] type-name;
/* ACF file */
typedef [allocate(all_nodes, dont_free)] PTYPE1;
typedef [allocate(all_nodes)] PTYPE2;
typedef [allocate(dont_free)] PTYPE3;
The ACF type attribute allocate lets you customize memory allocation and deallocation for a type defined in the IDL file. These are the valid options:
Option | Description |
---|---|
all_nodes | Makes one call to allocate and free memory for all nodes. |
single_node | Makes many individual calls to allocate and free each node of memory. |
free | Frees memory on return from the server stub. |
dont_free | Does not free memory on return from the server stub. |
By default, the stubs may allocate storage for data referenced by a unique or full pointer by calling midl_user_allocate and midl_user_free individually for each pointer.
You can optimize the speed of your application by specifying the option all_nodes. This option directs the stub to compute the size of all memory referenced through the pointer of the specified type and to make a single call to midl_user_allocate. The stub releases the memory by making one call to midl_user_free.
The dont_free option directs the MIDL compiler to generate a server stub that does not call midl_user_free for the specified type. The dont_free option allows the pointer structures to remain accessible to the server application after the remote procedure call has completed and returned to the client.
Note that when applied to types used for in, out parameters, any parameter that is a pointer to a type qualified with the all_nodes option will cause a reallocation when the data is unmarshalled. It is the responsibility of the application to free the previously allocated memory corresponding to this parameter. For example:
typedef struct foo
{
[string] char * PFOO;
} * PFOO
HRESULT proc1 ( [in,out] PFOO * ppfoo);
The data type PFOO will be reallocated in the out direction by the stub before "unmarshalling." Therefore, the previously allocated area must be freed by the application or a memory leak will occur.
ACF, midl_user_allocate, midl_user_free, typedef