Что означает каретка ('^') в C ++ / CLI?


212

Я только что наткнулся на этот код, и несколько поисков в Google не дают объяснения этому таинственному (для меня) синтаксису.

Hashtable^ tempHash = gcnew Hashtable(iterators_);

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();

Какого черта означает карета? (Это gcnewтакже ново для меня, и я спросил об этом здесь .)


Ответы:


176

Это C ++ / CLI, и символ каретки является управляемым эквивалентом * (указателя), который в терминологии C ++ / CLI называется «дескриптором» «ссылочного типа» (поскольку у вас все еще могут быть неуправляемые указатели).

(Спасибо Aardvark за указание на лучшую терминологию.)


5
Синтаксис "&" (я полагаю, "неуправляемая ссылка") все еще существует в C ++ / CLI?
Оуэн

C ++ / CLI является расширением обычного C ++, так что да - это только для неуправляемых ссылок
1800 ИНФОРМАЦИЯ

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

В общем, punctuator %является ^как punctuator &это *. В C ++ унарный &оператор в C ++ / CLI является унарным %оператором.

В то время как &ptrдает урожайность P*, %mngdдает доходность при MO^.


1
Я бы скорее сказал, почему бы не ^ mngd вместо * mngd. Это сбивает с толку внезапно позволенное использование символа неуправляемого указателя (*), а не управляемого указателя (^) перед фактической переменной, объявленной в управляемой куче.
swcraft

20

Это означает, что это ссылка на управляемый объект вместо обычного указателя C ++. Объекты, стоящие за такими ссылками, управляются средой выполнения и могут быть перемещены в память. Они также собираются автоматически.


17

Когда вы распределяете управляемую память, эта память может перемещаться сборщиком мусора. Оператор ^ - это указатель на управляемую память, который продолжает указывать на правильное место, даже если сборщик мусора перемещает объект, на который он указывает.


4

Похоже, что из MSDN каретка означает, что вы получаете указатель на создаваемый тип.

https://web.archive.org/web/20150117095313/http://msdn.microsoft.com/en-us/library/te3ecsc8%28VS.80%29.aspx



исправлена ​​ссылка на копию archive.org. Честно говоря, ссылки MSDN настолько хрупки, что все новые ссылки MSDN нужно просто запустить с сайта archive.org с самого начала.
Anssssss


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.