Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Ссылка на отслеживание () ведет себя как обычная ссылка на 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