Was bedeutet das Caret ('^') in C ++ / CLI?

212

Ich bin gerade auf diesen Code gestoßen und einige Google-Suchanfragen haben keine Erklärung für diese mysteriöse (für mich) Syntax ergeben.

Hashtable^ tempHash = gcnew Hashtable(iterators_);

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();

Was zum Teufel bedeutet das Caret? (Das gcnewist auch neu für mich, und ich habe hier danach gefragt .)

Owen
quelle
6
Übrigens wird es "Hut" ausgesprochen .
kmote

Antworten:

176

Dies ist C ++ / CLI und das Caret ist das verwaltete Äquivalent eines * (Zeigers), der in der C ++ / CLI-Terminologie als 'Handle' für einen 'Referenztyp' bezeichnet wird (da Sie immer noch nicht verwaltete Zeiger haben können).

(Vielen Dank an Aardvark für den Hinweis auf die bessere Terminologie.)

Rob Walker
quelle
5
Ist die Syntax "&" (ich nehme an, "nicht verwaltete Referenz") in C ++ / CLI noch vorhanden?
Owen
C ++ / CLI ist eine Erweiterung von regulärem C ++, also ja - es ist jedoch nur für nicht verwaltete Referenzen
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

Im Allgemeinen ist der Satzzeichen %so, ^wie der Satzzeichen &ist *. In C ++ ist der unäre &Operator in C ++ / CLI der unäre %Operator.

Während &ptrAusbeuten a P*, %mngdAusbeuten bei MO^.

Salomon
quelle
1
Ich würde eher sagen, warum nicht ^ mngd statt * mngd. Es ist plötzlich verwirrend, nicht verwaltetes Zeigersymbol (*) zu verwenden, nicht den verwalteten Zeiger (^) vor der tatsächlich im verwalteten Heap deklarierten Variablen.
Swcraft
20

Dies bedeutet, dass dies ein Verweis auf ein verwaltetes Objekt im Vergleich zu einem regulären C ++ - Zeiger ist. Objekte hinter solchen Referenzen werden von der Laufzeit verwaltet und können im Speicher verschoben werden. Sie werden auch automatisch gesammelt.

Franci Penov
quelle
17

Wenn Sie verwalteten Speicher zugewiesen haben, kann dieser Speicher vom Garbage Collector verschoben werden. Der Operator ^ ist ein Zeiger für den verwalteten Speicher, der auch dann auf die richtige Stelle zeigt, wenn der Garbage Collector das Objekt verschiebt, auf das er zeigt.

Joel Coehoorn
quelle
3

In C ++ / CLI bedeutet dies einen verwalteten Zeiger. Weitere Informationen (und andere C ++ / CLI-Funktionen) finden Sie hier:

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

Mark Ingram
quelle
2

Dies bedeutet, dass es sich um eine Referenz auf ein verwaltetes Objekt handelt.

1800 INFORMATIONEN
quelle