一意のポインター

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 で、呼び出し後に有効な文字列を指します。

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 ルーチンで処理されるサーバーに送信される文字データへの一意のポインターです。