插入符号('^')在C ++ / CLI中是什么意思?


212

我只是碰到了这段代码,一些Google搜索并没有对此神秘的语法(对我而言)做出任何解释。

Hashtable^ tempHash = gcnew Hashtable(iterators_);

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();

插入符号是什么意思?(这gcnew对我来说也很新,我在这里问了这个问题。)


6
顺便说一句,它发音为“ hat”
kmote 2015年

Answers:


176

这是C ++ / CLI,插入符号是*(指针)的托管等效项,在C ++ / CLI术语中,它称为“引用类型” 的“句柄 ”(因为您仍然可以拥有非托管指针)。

(感谢Aardvark指出了更好的术语。)


5
C ++ / CLI中是否仍然存在(我认为是“非托管引用”)语法“&”?
Owen,

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

在一般情况下,加标点%^因为加标点&*。在C ++中,一元运算&符在C ++ / CLI中是一元运算%符。

&ptr产生a时P*%mngd产生MO^


1
我宁愿说为什么不使用^ mngd而不是* mngd。。这使所有突然被允许使用非托管指针符号(*),而不是在托管堆中声明的实际变量前面的托管指针(^)感到困惑。
swcraft

20

这意味着这是对托管对象和常规C ++指针的引用。这些引用后面的对象由运行时管理,可以在内存中重定位。它们也会自动被垃圾收集。


17

当您分配托管内存时,垃圾回收器可以移动该内存。^运算符是托管内存的指针,即使垃圾收集器移动了它指向的对象,该指针也继续指向正确的位置。




By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.