跟踪引用运算符(C++ 组件扩展)
“跟踪引用”(%) 的行为与普通 C++ 引用 (&) 相似,区别在于,将对象指定给跟踪引用时,对象的引用计数会递增。
所有平台
跟踪引用具有下列特征:
将对象分配给跟踪引用会导致对象的引用计数递增。
本机引用 (&) 是您取消引用 * 时的结果。 跟踪引用 (%) 是您取消引用 ^ 时的结果。 & 和 % 之间的唯一差别在于:& 是“原始”引用,而 % 是对引用计数的引用。 只要有指向对象的 %,该对象就会一直保留在内存中。
点 (.) 成员访问运算符用于访问对象的成员。
只能在堆栈上声明跟踪引用。 跟踪引用不能成为类的成员。
跟踪引用对值类型和句柄 (String^) 有效。
不能为跟踪引用赋 null 值或赋 nullptr 值。 根据需要,可以将一个跟踪引用重新分配给另一个有效对象,没有次数限制。
跟踪引用不能用作一元获取地址运算符。
Windows 运行时
跟踪引用的行为与引用计数的标准 C++ 引用类似。 有关 C++ 引用的详细信息,请参阅引用 (C++)。
下面的示例演示如何使用跟踪引用来修改引用所指向对象的内容。
/ZW
using namespace Platform;
int main()
{
array<String^> ^arr = ref new array<String^>(10);
int i = 0;
for(int i = 0; i < 10; ++i){
String^& s = arr[i];
s = i++.ToString(); // changes the array content
}
}
公共语言运行时
当您绑定到垃圾回收堆上 CLR 类型的对象时,可以使用句柄的跟踪引用。
在 CLR 中,只要垃圾回收器移动引用的对象,跟踪引用变量的值就会自动更新。
不可能对垃圾回收堆上的对象进行本机 C++ 引用。
有关 C++/CLI 中跟踪引用的详细信息,请参阅:
示例
示例
下面的示例演示如何搭配使用跟踪引用与本机和托管类型。
// 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;
}
示例
下面的示例演示如何将跟踪引用绑定到数组。
// 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]);
}
输出