一意のポインター
C プログラムでは、複数のポインターにデータのアドレスを含めることができます。 ポインターは、データの エイリアス を作成すると言われます。 別名は、ポインターが宣言された変数を指す場合にも作成されます。 次のコード フラグメントは、これらのエイリアシングの両方の方法を示しています。
int iAnInteger=50;
// The next statement makes ipAnIntegerPointer an
// alias for iAnInteger.
int *ipAnIntegerPointer = &iAnInteger;
// This statement creates an alias for ipAnIntegerPointer.
int *ipAnotherIntegerPointer = ipAnIntegerPointer;
一般的な C プログラムでは、次の定義を使用してバイナリ ツリーを指定できます。
typedef struct _treetype
{
long lValue;
struct _treetype * left;
struct _treetype * right;
} TREETYPE;
TREETYPE * troot;
複数のポインターがツリー ノードの内容にアクセスできます。 これは通常、配布されていないアプリケーションでは問題ありません。 ただし、このスタイルのプログラミングでは、より複雑な RPC サポート コードが生成されます。 クライアントスタブとサーバースタブには、データとポインターを管理するための追加のコードが必要です。 基になるスタブ コードは、アドレスへのさまざまなポインターを解決し、最新バージョンを表すデータのコピーを決定する必要があります。
アプリケーションがそのメモリ領域にアクセスできる唯一の方法がポインターであることを保証する場合は、処理の量を減らすことができます。 ポインターには、C ポインターの機能の多くを引き続き含めることができます。 たとえば、null 値とnull 以外の値を変更したり、同じままにしたりすることができます。 次の例を使って説明します。 ポインターは呼び出しの前に null で、呼び出し後に有効な文字列を指します。
既定では、MIDL コンパイラはパラメーターではないすべてのポインターに [ unique] ポインター属性を適用します。 この既定の設定は、[ pointer_default] 属性で変更できます。
一意のポインターには、次の特性があります。
- 値は null にすることができます。
- 呼び出し中に null から null 以外に変更できます。 値が null 以外に変わると、戻り時に新しいメモリが割り当てられます。
- 呼び出し中に null 以外から null に変更できます。 値が NULL に変わると、アプリケーションはメモリを解放します。
- この値は、null 以外の値から別の値に変更できます。
- 一意のポインターが指すストレージには、操作の他のポインターまたは名前でアクセスできません。
- ポインターに null 値がない場合、戻りデータは既存のストレージに書き込 まれます。
次の例では、一意のポインターを定義する方法を示します。
/* IDL file */
[
uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
version(1.0)
]
interface RefPtrInterface
{
void RemoteFn([in, unique] char *ach);
}
この例では、パラメーター ach は、RemoteFn ルーチンで処理されるサーバーに送信される文字データへの一意のポインターです。