Оператор отслеживания ссылок (расширения компонентов 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 в куче со сборкой мусора.

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

Output