Оператор отслеживания ссылок (расширения компонентов 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 см. в следующих разделах:
Как Передайте типы среды CLR ссылкой со ссылками отслеживания
Как Функции шаблона записи, которые принимают собственные, значение или ссылочные параметры
Примеры
Пример
В следующем примере показано, как использовать отслеживаемые ссылки в собственных и управляемых типах.
// 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