メモリ割り当て規則の概要
次の表は、メモリ割り当てに関する主な規則をまとめたものです。
MIDL 要素 | 説明 |
---|---|
最上位の [ ref] ポインター | null 以外のポインターである必要があります。 |
関数の戻り値 | 新しいメモリは常にポインターの戻り値に割り当てられます。 |
[ unique, out] または [ ptr, out] ポインター | MIDL では使用できません。 |
null から null 以外に変更される最上位以外の [unique、 in、 out] または [ptr, in, out] ポインター | クライアント スタブは、戻り時にクライアントに新しいメモリを割り当てます。 |
null 以外から null に変更される最上位以外の [unique, in, out] ポインター | メモリはクライアントで孤立しています。クライアント アプリケーションは、メモリの解放とリークの防止を担当します。 |
null 以外から null に変更される最上位以外の [ptr、 in、 out] ポインター | エイリアス化されていない場合、メモリはクライアントで孤立します。クライアント アプリケーションは、この場合のメモリ リークを解放して防止する役割を担います。 |
[ref] ポインター | 通常、クライアント アプリケーション レイヤーは を割り当てます。 |
null 以外の [in, out] ポインター | スタブは、クライアント上の既存のストレージに書き込もうとします。 [string] と size がクライアントに割り当てられたサイズを超えて増加すると、戻り時に GP エラーが発生します。 |
次の表は、キー IDL 属性と ACF 属性がメモリ管理に及ぼす影響をまとめたものです。
MIDL 機能 | クライアントの問題 | サーバーの問題 |
---|---|---|
[ allocate(single_node)], [allocate(all_nodes)] | メモリ関数に対して 1 つまたは複数の呼び出しが行われるかどうかを決定します。 | クライアントと同じですが、プライベート メモリを割り当てる (single_node) [入力] データと [入力]、出力データに使用できることがよくあります。 |
[allocate(free)] または [allocate(dont_free)] | (なし。サーバーに影響します)。 | リモート プロシージャ呼び出しのたびに、サーバー上のメモリを解放するかどうかを指定します。 |
array 属性 [ max_is] と [ size_is] | (なし。サーバーに影響します)。 | 割り当てるメモリのサイズを決定します。 |
[ byte_count] | クライアントはバッファーを割り当てる必要があります。クライアント スタブによって割り当ても解放もされません。 | ACF パラメーター属性は、サーバーに割り当てられたバッファーのサイズを決定します。 |
[ enable_allocate] | 通常、なし。 ただし、クライアントが別のメモリ管理環境を使用している可能性があります。 | サーバーは別のメモリ管理環境を使用します。 RpcSmAllocate は割り当てに使用する必要があります。 |
[ in]attribute | データにメモリを割り当てるクライアント アプリケーション。 | スタブによってサーバーに割り当てられます。 |
[ out] 属性 | スタブによってクライアントに割り当てられます。 | [out]-only ポインターは [ref] ポインターである必要があります。スタブによってサーバーに割り当てられます。 |
[ ref] 属性 | ポインターによって参照されるメモリは、クライアント アプリケーションによって割り当てられる必要があります。 | スタブによって管理される最上位および第 1 レベルの参照ポインター。 |
[ unique] 属性 | null 以外から null の場合、メモリが孤立する可能性があります。null を null 以外に設定すると、クライアント スタブは midl_user_allocate を呼び出します。 | (クライアントに影響します。 |
[ ptr] 属性 | (「 [unique]」を参照)。 | (「 [unique]」を参照)。 |