追蹤參考運算子 (C++/CLI 和 C++/CX)
追蹤參考 (%
) 的行為就像一般C++參考 (&
) 不同之處在於,當物件指派給追蹤參考時,對象的參考計數會遞增。
所有平台
追蹤參考有下列特性:
將物件指派給追蹤參考會導致對象的參考計數遞增。
原生參考 (
&
) 是當您為*
取值時的結果。 追蹤參考 (%
) 是當您為^
取值時的結果。 只要您有物件的%
,物件就會持續保留於記憶體中。點 (
.
) 成員存取運算子是用來存取物件的成員。追蹤參考適用於實值型別和控制代碼 (例如
String^
)。追蹤參考無法指派 Null 或
nullptr
值。 追蹤參考可視需求重新指派給另一個有效物件多次。追蹤參考不可做為一元取址運算子。
Windows 執行階段
追蹤參考的行為類似標準的 C++ 參考,差異在於 % 是參考計數。 下列程式碼片段示範如何在 % 和 ^ 類型之間轉換:
Foo^ spFoo = ref new Foo();
Foo% srFoo = *spFoo;
Foo^ spFoo2 = %srFoo;
下列範例顯示如何將 ^ 傳遞至採用 % 的函式。
ref class Foo sealed {};
// internal or private
void UseFooHelper(Foo% f)
{
auto x = %f;
}
// public method on ABI boundary
void UseFoo(Foo^ f)
{
if (f != nullptr) { UseFooHelper(*f); }
}
通用語言執行平台
在 C++/CLI 中,繫結至記憶體回收堆積上的 CLR 類型物件時,可使用控制代碼的追蹤參考。
在 CLR,當記憶體回收行程移動所參考的物件時,會自動更新追蹤參考變數的值。
只能在堆疊上宣告追蹤參考。 追蹤參考不可以是類別的成員。
在記憶體回收堆積上的物件不可能有原生 C++ 參考。
如需 C++/CLI 追蹤參考的詳細資訊,請參閱:
範例
下列 C++/CLI 範例示範如何搭配使用追蹤參考與原生和 Managed 類型。
// tracking_reference_1.cpp
// compile with: /clr
ref class MyClass {
public:
int i;
};
value struct MyStruct {
int k;
};
int main() {
MyClass ^ x = ref new MyClass;
MyClass ^% y = x; // tracking reference handle to reference object
int %ti = x->i; // tracking reference to member of reference type
int j = 0;
int %tj = j; // tracking reference to object on the stack
int * pi = new int[2];
int % ti2 = pi[0]; // tracking reference to object on native heap
int *% tpi = pi; // tracking reference to native pointer
MyStruct ^ x2 = ref new MyStruct;
MyStruct ^% y2 = x2; // tracking reference to value object
MyStruct z;
int %tk = z.k; // tracking reference to member of value type
delete[] pi;
}
下列 C++/CLI 範例示範如何將追蹤參考繫結至陣列。
// tracking_reference_2.cpp
// compile with: /clr
using namespace System;
int main() {
array<int> ^ a = ref new array<Int32>(5);
a[0] = 21;
Console::WriteLine(a[0]);
array<int> ^% arr = a;
arr[0] = 222;
Console::WriteLine(a[0]);
}
21
222