Operatore di riferimento di rilevamento (Estensioni del componente C++)
Il riferimento di traccia (%) si comporta come un riferimento ordinario C++ (&), ma quando un oggetto viene assegnato a un riferimento di traccia, 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 traccia causa l'incremento del conteggio dei riferimenti dell'oggetto.
Un riferimento nativo (&) è il risultato quando si dereferenzia un *. Un riferimento di traccia (%) è il risultato quando si dereferenzia un ^. L'unica differenza tra & e % è che & è un riferimento "non elaborato" e % è un riferimento con conteggio dei riferimenti. Se si dispone di un % per un oggetto, l'oggetto rimane attivo in memoria.
L'operatore punto (.) di accesso ai membri viene utilizzato per accedere a un membro dell'oggetto.
Un riferimento di traccia può essere dichiarato solo sullo stack e non può essere membro di una classe.
I riferimenti di traccia sono validi per gli handle e i tipi di valore (ad esempio String^).
Un riferimento di traccia non può essere assegnato a un valore null o nullptr. 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++ con conteggio dei riferimenti. Per informazioni sui riferimenti C++, vedere Riferimenti (C++).
Di seguito viene illustrato come utilizzare un riferimento di traccia per modificare il contenuto dell'oggetto a cui punta.
/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
È possibile utilizzare 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.
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:
Procedura: Passare i tipi CLR per riferimento con i riferimenti di rilevamento
Procedura: Utilizzare i riferimenti di rilevamento e i tipi di valore
Procedura: riferimenti di rilevamento di utilizzo e puntatori interni
Procedura: Scrivere funzioni del modello che accettano native, il valore, o parametri di riferimento
Esempi
Esempio
Nel seguente esempio viene illustrato come utilizzare 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;
}
Esempio
Nel seguente esempio 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]);
}
Output