Operátor sledovacího odkazu (C++/CLI a C++/CX)
Sledovací odkaz (%
) se chová jako běžný odkaz jazyka C++ s&
tím rozdílem, že pokud je objekt přiřazen ke sledování odkazu, zvýší se počet odkazů objektu.
Všechny platformy
Odkaz na sledování má následující charakteristiky.
Přiřazení objektu ke sledování odkazu způsobí, že se zvýší počet odkazů objektu.
Nativní odkaz (
&
) je výsledek při dereference a*
. Sledování odkazu (%
) je výsledek při dereference a^
. Pokud máte%
objekt, zůstane objekt naživu v paměti.Operátor tečky (
.
) člen-access slouží pro přístup k členu objektu.Sledovací odkazy jsou platné pro typy hodnot a popisovače (například
String^
).Sledovací odkaz nemůže být přiřazen s hodnotou null nebo
nullptr
hodnotou. Sledovací odkaz může být znovu přiřazen k jinému platnému objektu tolikrát, kolikrát je to nutné.Sledovací odkaz nelze použít jako operátor unární adresy take-address.
prostředí Windows Runtime
Sledovací odkaz se chová jako standardní odkaz jazyka C++, s tím rozdílem, že se počítá % odkazů. Následující fragment kódu ukazuje, jak převést mezi typy % a ^:
Foo^ spFoo = ref new Foo();
Foo% srFoo = *spFoo;
Foo^ spFoo2 = %srFoo;
Následující příklad ukazuje, jak předat ^ funkci, která přebírá %.
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 (Common Language Runtime)
V jazyce C++/CLI můžete při vytvoření vazby k objektu typu CLR v haldě s uvolňováním paměti použít sledovací odkaz na popisovač.
V CLR je hodnota sledovací referenční proměnné automaticky aktualizována vždy, když uvolňování paměti přesune odkazovaný objekt.
Sledovací odkaz lze deklarovat pouze v zásobníku. Sledovací odkaz nemůže být členem třídy.
Není možné mít nativní odkaz jazyka C++ na objekt v haldě s uvolňováním paměti.
Další informace o sledování odkazů v C++/CLI najdete tady:
Příklady
Následující ukázka pro C++/CLI ukazuje, jak používat sledovací odkaz s nativními a spravovanými typy.
// 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;
}
Následující ukázka pro C++/CLI ukazuje, jak vytvořit vazbu sledovacího odkazu na pole.
// 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