一意 ポインターとは異なり、完全なポインターはエイリアスをサポートします。 つまり、次の図に示すように、複数のポインターが同じデータを参照できます。
同じデータする
完全なポインターには、次の特性があります。
- 値が null の場合があります。
- 呼び出し中に null から null 以外に変更できます。 値が null 以外に変わると、クライアント スタブは、戻るときに割り当てられた新しいメモリを割り当てます。 クライアント プログラムは、終了する前にこのメモリを解放する必要があります。
- 呼び出し中に null 以外から null に変更される可能性があります。 値が null に変わると、アプリケーションはメモリを解放します。
- この値は、null 以外の値から別の値に変更される可能性があります。
- 完全ポインターが指すストレージは、操作内の別のポインターまたは名前によってアクセスされる可能性があります。
- ポインターに null 値がない場合、戻りデータは既存のストレージに書き込まれます。
次の例に示すように、[ptr] 属性を使用して、完全なポインターを指定します。
/* IDL file */
[
uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
version(1.0)
]
interface FullPtrInterface
{
void RemoteFn([in,ptr,string]) char *ptrName1,
[in,ptr,string] char *ptrName2);
}
この例では、ptrName1 パラメーターと ptrName2 パラメーターは、文字列への完全なポインターとして定義されています。 両方のポインターが、1 つの文字列を含む同じメモリ アドレスを指している可能性があります。
[ptr] は、エイリアスのサポートを提供するときに必要です。 ただし、RPC で使用できるすべてのポインターを最も多く処理する必要があるため、ほとんどのアプリケーションでは推奨されません。