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