跟踪引用运算符(C++ 组件扩展)

跟踪引用 (%) 的行为与普通 C++ 引用 (&),但,将对象分配给跟踪引用时,对象的引用计数递增。

所有平台

跟踪引用具有下列特征。

  • 对象的分配以跟踪对对象的引用将增加的计数的原因。

  • 本机引用 (&) 为因此,当您取消引用、*时。 跟踪引用 (%) 为因此,当您取消引用^时。 唯一的差异&和 % 是位置&为“原始”引用,% 是引用计数的引用。 只要具有 % 给对象,该对象将保持对内存。

  • 句点 (.) 成员访问运算符用于访问对象的成员。

  • 跟踪在堆栈引用只能声明。 跟踪引用不能是选件类的成员。

  • 跟踪引用为值类型和句柄 (例如 String^) 有效。

  • 跟踪引用不能分配 null 或 nullptr 值。 跟踪引用可以重新分配给另一个有效的对象根据需要多次。

  • 跟踪引用不能用作一元"作为 address-of 运算符。

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 引用,请参见:

8903062a.collapse_all(zh-cn,VS.110).gif示例

示例

下面的示例演示如何使用跟踪引用包含本机和托管类型。

// 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]);
}

Output