唯一指標
在 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 編譯程式會將 [唯一] 指標屬性套用至非參數的所有指標。 您可以使用 [ 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 例程處理之字元數據的唯一指標。