次の方法で共有


一意のポインター

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 コンパイラは[一意の] ポインター属性を、パラメーターではないすべてのポインターに適用します。 このデフォルト設定は、[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 ルーチンで処理されるサーバーに送信される文字データへの一意のポインターです。