Summary of Memory Allocation Rules

The following table summarizes key rules regarding memory allocation.

MIDL element Description
Top-level [ ref] pointers Must be non-null pointers.
Function return value New memory is always allocated for pointer return values.
[ unique, out] or [ ptr, out] pointer Not allowed by MIDL.
Non-top-level [unique, in, out] or [ptr, in, out] pointer that changes from null to non-null Client stubs allocate new memory on client on return.
Non-top-level [unique, in, out] pointer that changes from non-null to null Memory is orphaned on client; client application is responsible for freeing memory and preventing leaks.
Non-top-level [ptr, in, out] pointer that changes from non-null to null Memory will be orphaned on client if not aliased; client application is responsible for freeing and preventing memory leaks in this case.
[ref] pointers Client-application layer usually allocates.
Non-null [in, out] pointer Stubs attempt to write into existing storage on client. If [string] and size increases beyond size allocated on the client, it will cause a GP-fault on return.

 

The following table summarizes the effects of key IDL and ACF attributes on memory management.

MIDL feature Client issues Server issues
[ allocate(single_node)], [allocate(all_nodes)] Determines whether one or many calls are made to the memory functions. Same as client, except private memory can often be used for allocate (single_node) [in] and [in,out] data.
[allocate(free)] or [allocate(dont_free)] (None; affects server.) Determines whether memory on the server is freed after each remote procedure call.
array attributes [ max_is] and [ size_is] (None; affects server.) Determines size of memory to be allocated.
[ byte_count] Client must allocate buffer; not allocated or freed by client stubs. ACF parameter attribute determines size of buffer allocated on server.
[ enable_allocate] Usually, none. However, the client may be using a different memory management environment. Server uses a different memory management environment. RpcSmAllocate should be used for allocations.
[ in]attribute Client application responsible for allocating memory for data. Allocated on server by stubs.
[ out] attribute Allocated on client by stubs. [out]-only pointer must be [ref] pointer; allocated on server by stubs.
[ ref] attribute Memory referenced by pointer must be allocated by client application. Top-level and first-level reference pointers managed by stubs.
[ unique] attribute Non-null to null can result in orphaned memory; null to non-null causes client stub to call midl_user_allocate. (Affects client.)
[ ptr] attribute (See [ unique].) (See [ unique].)