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 .)

Owen
la source
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.)

Rob Walker
la source
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^.

salomon
la source
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.

Franci Penov
la source
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.

Joel Coehoorn
la source
3

En C ++ / CLI, cela signifie un pointeur géré. Vous pouvez en savoir plus à ce sujet (et d'autres fonctionnalités C ++ / CLI) ici:

http://en.wikipedia.org/wiki/C%2B%2B/CLI

Mark Ingram
la source
2

Cela signifie qu'il s'agit d'une référence à un objet géré.

1800 INFORMATION
la source