共用方式為


唯一指標

在 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 值變更為另一個。
  • 作業中任何其他指標或名稱都無法存取唯一指標所指向的記憶體。
  • 如果指標的值 null,則傳回數據會寫入現有的記憶體。

下列範例示範如何定義唯一指標。

/* IDL file */
[ 
  uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
  version(1.0)
]
interface RefPtrInterface
{
  void RemoteFn([in, unique] char *ach);
}

在此範例中,參數 ach 是傳送至伺服器以使用 RemoteFn 例程處理之字元數據的唯一指標。