Que signifie le signe d'insertion ('^') en C ++ / CLI?


212

Je viens de tomber sur ce code et quelques recherches sur Google ne révèlent aucune explication de cette mystérieuse (pour moi) syntaxe.

Hashtable^ tempHash = gcnew Hashtable(iterators_);

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();

Que diable signifie le curseur? (Le gcnewest également nouveau pour moi, et j'ai posé des questions à ce sujet ici .)


6
Soit dit en passant, il est prononcé "chapeau" .
kmote

Réponses:


176

Il s'agit de C ++ / CLI et le signe d'insertion est l'équivalent géré d'un * (pointeur) qui, dans la terminologie C ++ / CLI, est appelé un «handle» vers un «type de référence» (car vous pouvez toujours avoir des pointeurs non gérés).

(Merci à Aardvark d'avoir souligné la meilleure terminologie.)


5
La syntaxe (je suppose "référence non managée") "&" existe-t-elle toujours en C ++ / CLI?
Owen

C ++ / CLI est une extension du C ++ normal, donc oui - c'est seulement pour les références non managées
1800 INFORMATION

77
// here normal pointer
P* ptr = new P; // usual pointer allocated on heap
P& nat = *ptr; // object on heap bind to native object

//.. here CLI managed 
MO^ mngd = gcnew MO; // allocate on CLI heap
MO% rr = *mngd; // object on CLI heap reference to gc-lvalue

En général, le ponctuateur %est à ^comme le ponctuateur &est à *. En C ++, l' &opérateur unaire est en C ++ / CLI, l' %opérateur unaire .

Alors que &ptrdonne a P*, %mngddonne à MO^.


1
Je préfère dire pourquoi ne pas ^ mngd au lieu de * mngd .. C'est tout à coup déroutant de pouvoir utiliser le symbole de pointeur non managé (*), pas le pointeur managé (^) devant la variable réellement déclarée dans le tas managé.
swcraft

20

Cela signifie qu'il s'agit d'une référence à un objet géré par rapport à un pointeur C ++ normal. Les objets derrière de telles références sont gérés par le runtime et peuvent être déplacés dans la mémoire. Ils sont également récupérés automatiquement.


17

Lorsque vous avez alloué de la mémoire gérée, cette mémoire peut être déplacée par le garbage collector. L'opérateur ^ est un pointeur pour la mémoire gérée, qui continue de pointer au bon endroit même si le garbage collector déplace l'objet vers lequel il pointe.




En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.