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

256
我刚刚发现了这段代码,但几次谷歌搜索都没有解释这个对我来说神秘的语法。
Hashtable^ tempHash = gcnew Hashtable(iterators_);

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();

插入符号(^)是什么意思?(gcnew 对我也很新奇,我在这里问过这里。)


10
顺便提一下,这个单词的发音是“hat”。 - kmote
8个回答

207

这是关于IT技术的内容,涉及到C++/CLI,而插入符号“^”则是指针“*”在C++/CLI中的托管等效物,它被称为指向“引用类型”的'句柄'(因为你仍然可以使用非托管指针)。

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


8
在C++/CLI中,是否仍然存在“&”(我假设是“未管理的引用”)语法? - Owen
C++/CLI是常规C++的扩展,因此是的 - 它仅适用于未管理的引用。 - 1800 INFORMATION
4
% 是 C++/CLI 中引用的托管版本。 - AJM

107
// 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产生P*%mngd则产生MO^


2
我宁愿说为什么不使用^mngd而不是mngd。这很令人困惑,因为突然间可以在托管堆中声明的实际变量前面使用未管理的指针符号(),而不是受控指针(^)。 - swcraft
谢谢!我正在寻找“%”标点符号的解释。 - Stefan

26

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


插入符(句柄)更像是指向托管对象的指针,而不是对其的引用。请参见https://web.archive.org/web/20150117095313/http://msdn.microsoft.com/en-us/library/yk97tc08(VS.80).aspx和/或https://learn.microsoft.com/en-us/cpp/extensions/tracking-reference-operator-cpp-component-extensions?view=msvc-160。 - AJM
抱歉,https://learn.microsoft.com/en-us/cpp/extensions/handle-to-object-operator-hat-cpp-component-extensions?view=msvc-160 比我上一个评论中的第二个链接更有用。 - AJM

23

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


5

5

失效的链接(2018年) - gbarry
2
修复了到archive.org副本的链接。说实话,MSDN链接非常脆弱,所有新的MSDN链接应该从一开始就通过archive.org运行。 - Anssssss

2
这意味着它是对托管对象的引用。

0
值得考虑以下几句话,它们以稍微不同的方式表达了答案:
“句柄声明符(^,发音为“帽子”)修改类型说明符,意味着当系统确定对象不再可访问时,声明的对象应自动删除。”
“因为本机 C++ 指针 (*) 和引用 (&) 不是托管引用,垃圾回收器无法自动更新它们所指向的地址。为解决此问题,请使用句柄声明符来指定垃圾回收器知道并可以自动更新的变量。”
(而“本机”是我个人认为比“句柄”更好的词,因为“句柄”可能更多地是由“Windows SDK”的使用所带来的词汇)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接