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


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


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


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.


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.




Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.