Sdílet prostřednictvím


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