238

我刚刚遇到了这段代码,一些谷歌搜索没有找到对这种神秘(对我来说)语法的解释。

Hashtable^ tempHash = gcnew Hashtable(iterators_);

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();

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

4

8 回答 8

191

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

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

于 2008-10-14T19:20:11.183 回答
94
// 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

一般来说,标点符号%是 to^就像标点符号&是 to一样*。在 C++ 中,一元运算&符在 C++/CLI 中是一元运算%符。

虽然&ptr产生 a P*,但%mngd产生于MO^

于 2013-01-17T11:45:00.060 回答
21

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

于 2008-10-14T19:21:58.060 回答
20

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

于 2008-10-14T19:23:38.087 回答
5

从 MSDN 看来,插入符号意味着您正在获取正在创建的类型的句柄。

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

于 2008-10-14T19:23:26.340 回答
4

在 C++/CLI 中,它表示托管指针。您可以在此处阅读有关它的更多信息(以及其他 C++/CLI 功能):

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

于 2008-10-14T19:23:05.530 回答
2

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

于 2008-10-14T19:20:09.950 回答
0

还值得考虑以下几句话,它们以稍微不同的方式给出答案:

“句柄声明符(^,发音为“帽子”)修改类型说明符,表示当系统确定对象不再可访问时,应自动删除声明的对象。

“由于本机 C++ 指针 (*) 和引用 (&) 不是托管引用,因此垃圾收集器无法自动更新它们指向的地址。要解决此问题,请使用句柄声明符指定垃圾收集器知道的变量并且可以自动更新。”

(恕我直言,“本机”是比“句柄”更好的词,因为句柄可能是通过使用“Windows SDK”引入的更多词)

于 2021-06-06T10:35:23.653 回答