Operatore di riferimento di traccia (C++/CLI e C++/CX)
Un riferimento di rilevamento (%
) si comporta come un normale riferimento C++ (&
) tranne che quando un oggetto viene assegnato a un riferimento di rilevamento, il conteggio dei riferimenti dell'oggetto viene incrementato.
Tutte le piattaforme
Un riferimento di traccia presenta le caratteristiche descritte di seguito.
L'assegnazione di un oggetto a un riferimento di rilevamento determina l'incremento del conteggio dei riferimenti dell'oggetto.
Un riferimento nativo (
&
) è il risultato quando si dereferenzia un oggetto*
. Un riferimento di traccia (%
) è il risultato quando si dereferenzia un oggetto^
. Se si ha un riferimento%
a un oggetto, l'oggetto rimane attivo in memoria.L'operatore punto (
.
) di accesso ai membri viene utilizzato per accedere a un membro dell'oggetto.I riferimenti di traccia sono validi per gli handle e i tipi di valore (ad esempio
String^
).Non è possibile assegnare un riferimento di rilevamento null o
nullptr
un valore. Può essere riassegnato a un altro oggetto valido quando necessario.Un riferimento di traccia non può essere utilizzato come operatore unario di acquisizione indirizzo.
Windows Runtime
Un riferimento di traccia si comporta come un riferimento standard C++, eccetto che % è un riferimento con conteggio dei riferimenti. Il frammento di codice riportato di seguito illustra come eseguire la conversione tra i tipi % e ^:
Foo^ spFoo = ref new Foo();
Foo% srFoo = *spFoo;
Foo^ spFoo2 = %srFoo;
L'esempio seguente mostra come passare ^ a una funzione che accetta un valore %.
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); }
}
Common Language Runtime
In C++/CLI è possibile usare un riferimento di traccia a un handle quando si esegue l'associazione a un oggetto di un tipo CLR nell'heap sottoposto a Garbage Collection.
In CLR, il valore di una variabile di riferimento di traccia viene aggiornato automaticamente ogni volta che il Garbage Collector sposta l'oggetto a cui si fa riferimento.
Un riferimento di traccia può essere dichiarato solo sullo stack e non può essere membro di una classe.
Non è possibile avere un riferimento C++ nativo a un oggetto nell'heap sottoposto a Garbage Collection.
Per ulteriori informazioni sui riferimenti di traccia in C++/CLI, vedere:
Esempi
Nel seguente esempio per C++/CLI viene illustrato come usare un riferimento di traccia con tipi gestiti e nativi.
// 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;
}
Nel seguente esempio per C++/CLI viene illustrato come associare un riferimento di traccia a una matrice.
// 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