我刚刚遇到了这段代码,一些谷歌搜索没有找到对这种神秘(对我来说)语法的解释。
Hashtable^ tempHash = gcnew Hashtable(iterators_);
IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();
插入符号到底是什么意思?(这gcnew
对我来说也是新的,我在这里问过这个问题。)
// 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^
。
这意味着这是对托管对象与常规 C++ 指针的引用。此类引用后面的对象由运行时管理,并且可以在内存中重新定位。它们也会自动进行垃圾收集。
当您分配托管内存时,垃圾收集器可以移动该内存。运算符是托管内存的指针,即使垃圾收集器移动它指向的对象,它也会^
继续指向正确的位置。
从 MSDN 看来,插入符号意味着您正在获取正在创建的类型的句柄。
在 C++/CLI 中,它表示托管指针。您可以在此处阅读有关它的更多信息(以及其他 C++/CLI 功能):
这意味着它是对托管对象的引用。
还值得考虑以下几句话,它们以稍微不同的方式给出答案:
“句柄声明符(^,发音为“帽子”)修改类型说明符,表示当系统确定对象不再可访问时,应自动删除声明的对象。
“由于本机 C++ 指针 (*) 和引用 (&) 不是托管引用,因此垃圾收集器无法自动更新它们指向的地址。要解决此问题,请使用句柄声明符指定垃圾收集器知道的变量并且可以自动更新。”
(恕我直言,“本机”是比“句柄”更好的词,因为句柄可能是通过使用“Windows SDK”引入的更多词)