allocate 属性
[allocate] ACF 属性を使用すると、IDL ファイルで定義されている型のメモリ割り当てと割り当て解除をカスタマイズできます。
typedef [allocate (allocate-option-list) [, type-attribute-list] ] type-name;
-
allocate-option-list
-
1 つ以上のメモリ割り当てオプションを指定します。 single_nodeまたはall_nodesのいずれかを選択するか、無料またはdont_freeのいずれかを選択するか、各ペアから 1 つを選択します。 複数のオプションを指定する場合は、オプションをコンマで区切ります。
-
type-attribute-list
-
その他の省略可能な ACF 型の属性を指定します。 複数の type 属性を指定する場合は、オプションをコンマで区切ります。
-
type-name
-
IDL ファイルで定義されている型を指定します。
[allocate] 属性には、次の有効なオプションがあります。
オプション | 説明 |
---|---|
all_nodes | 1 回の呼び出しを行って、すべてのノードにメモリを割り当てて解放します。 |
single_node | メモリの各ノードを割り当てて解放するために、多数の個別の呼び出しを行います。 |
free | サーバー スタブからの復帰時にメモリを解放します。 |
dont_free | サーバー スタブからの復帰時にメモリを解放しません。 |
既定では、スタブは、midl_user_allocateを呼び出し、ポインターごとに個別にmidl_user_freeすることで、一意または完全なポインターによって参照されるデータにストレージを割り当てることができます。
all_nodesオプションを指定することで、アプリケーションの速度を最適化できます。 このオプションは、指定した型のポインターを介して参照されるすべてのメモリのサイズを計算し、 midl_user_allocateを 1 回呼び出すようにスタブに指示します。 スタブは、 midl_user_freeを 1 回呼び出すことでメモリを解放します。
dont_free オプションは、MIDL コンパイラに、指定した型のmidl_user_freeを呼び出さないサーバー スタブを生成するように指示します。 dont_free オプションを使用すると、リモート プロシージャ 呼び出しが完了してクライアントに戻った後も、サーバー アプリケーションからポインター構造にアクセスできます。
[allocate] 属性を使用すると、データがマーシャリングされていないときにメモリを再割り当てするために、all_nodes オプションで修飾された型へのポインターである [in, out] パラメーターが発生します。 このパラメーターに対して以前に割り当てられたメモリを解放するのは、アプリケーションの役割です。 次に例を示します。
typedef struct thistype
{
[string] char * PTHISTYPE;
} * PTHISTYPE
HRESULT proc1 ( [in,out] PTHISTYPE * ppthistype);
データ型 PTHISTYPE は、マーシャリングを解除する前にスタブによって [out] 方向に再割り当てされます。 そのため、アプリケーションは、このパラメーターのデータに以前に割り当てたメモリを解放する必要があります。または、メモリ リークが発生します。
/* ACF file */
typedef [allocate(all_nodes, dont_free)] PTYPE1;
typedef [allocate(all_nodes)] PTYPE2;
typedef [allocate(dont_free)] PTYPE3;