Freigeben über


Nachverfolgungsverweisoperator (Komponentenerweiterungen für C++)

Ein Nachverfolgungsverweis (%) verhält sich fast wie ein normaler C++-Verweis (&) – der Unterschied ist, dass nach der Zuweisung eines Objekts zu einem Nachverfolgungsverweis der Verweiszähler des Objekts erhöht wird.

Alle Plattformen

Ein Nachverfolgungsverweis verfügt über die folgenden Eigenschaften.

  • Die Zuweisung eines Objekts zu einem Nachverfolgungsverweis bewirkt, dass der Verweiszähler des Objekts erhöht wird.

  • Wenn Sie einen * dereferenzieren, ist das Ergebnis ein systemeigener Verweis (&). Wenn Sie einen ^ dereferenzieren, ist das Ergebnis ein Nachverfolgungsverweis (%). Der einzige Unterschied zwischen & und % ist, dass & ein "normaler" Verweis und % ein Verweis mit Verweiszählung ist. Solange Sie über einen % zu einem Objekt verfügen, bleibt das Objekt im Speicher erhalten.

  • Der Punktzugriffsoperator (.) für Member wird verwendet, um auf einen Member des Objekts zuzugreifen.

  • Ein Nachverfolgungsverweis kann nur auf dem Stapel deklariert werden. Ein Nachverfolgungsverweis kann kein Klassenmember sein.

  • Nachverfolgungsverweise gelten für Werttypen und Handles (beispielsweise String^).

  • Einem Nachverfolgungsverweis kann kein NULL- oder nullptr-Wert zugewiesen werden. Ein Nachverfolgungsverweis kann einem anderen gültigen Objekt so oft wie erforderlich neu zugewiesen werden.

  • Ein Nachverfolgungsverweis kann nicht als unärer Adressenübernahmeoperator (Take-Address-Operator) verwendet werden.

Windows-Runtime

Ein Nachverfolgungsverweis verhält sich wie ein Standard-C++-Verweis mit Verweiszählung. Weitere Informationen über C++-Verweise finden Sie unter Verweise (C++).

Das folgende Beispiel veranschaulicht, wie ein Nachverfolgungsverweis verwendet wird, um den Inhalt des Objekts zu ändern, auf das er verweist.

/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
    }
}

Common Language Runtime

Sie können einen Nachverfolgungsverweis auf ein Handle verwenden, um eine Bindung zu einem Objekt eines CLR-Typs auf dem Heap der Garbage Collection herzustellen.

In der CLR wird der Wert einer Nachverfolgungsverweisvariablen automatisch aktualisiert, wenn der Garbage Collector das referenzierte Objekt verschiebt.

Die Verwendung eines systemeigenen C++-Verweises auf ein Objekt auf dem Heap der Garbage Collection ist nicht möglich.

Weitere Informationen über Nachverfolgungsverweise in C++/CLI finden Sie unter:

Beispiele

Beispiel

Das folgende Beispiel veranschaulicht, wie ein Nachverfolgungsverweis mit systemeigenen und verwalteten Typen verwendet wird.

// 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;
}

Beispiel

Das folgende Beispiel veranschaulicht, wie ein Nachverfolgungsverweis an ein Array gebunden wird.

// 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]);
}

Ausgabe