唯一指標

在 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 常式一起處理的伺服器。