Оператор отслеживаемых ссылок (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); }
}
Среда CLR
В C++/CLI можно использовать отслеживаемую ссылку на дескриптор при привязке к объекту типа CLR в куче со сборкой мусора.
В CLR значение переменной отслеживаемой ссылки обновляется автоматически, когда сборщик мусора перемещает указанный объект.
Отслеживаемая ссылка может быть объявлена только в стеке. Отслеживаемая ссылка не может быть членом класса.
Невозможно создать собственную ссылку C++ на объект, находящийся в куче со сборкой мусора.
Дополнительные сведения об отслеживаемых ссылках C++/CLI см. в следующих разделах:
Примеры
В следующем примере для 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;
}
В следующем примере для 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