【问题标题】:What does the caret (‘^’) mean in C++/CLI?C++/CLI 中的插入符号 ('^') 是什么意思?
【发布时间】:2010-09-17 04:16:09
【问题描述】:

我只是偶然发现了这段代码,在谷歌搜索中没有找到对这种神秘(对我而言)语法的解释。

Hashtable^ tempHash = gcnew Hashtable(iterators_);

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();

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

【问题讨论】:

标签: .net c++-cli


【解决方案1】:

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

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

【讨论】:

  • C++/CLI 中是否仍然存在(我想是“非托管引用”)语法“&”?
  • C++/CLI 是常规 C++ 的扩展,所以是的 - 它仅适用于非托管引用
  • % 是 C++/CLI 中引用的托管版本。
【解决方案2】:
// 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^

【讨论】:

  • 我宁愿说为什么不用 ^mngd 而不是 * mngd.. 突然之间允许使用非托管指针符号(*)而不是实际变量前面的托管指针(^)令人困惑在托管堆中声明。
  • 谢谢!我正在寻找% 标点符号的解释。
【解决方案3】:

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

【讨论】:

【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

    • 死链接(2018)
    • 修复了指向 archive.org 副本的链接。老实说,MSDN 链接非常脆弱,所有新的 MSDN 链接应该从一开始就通过archive.org 运行。
    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

      表示它是对托管对象的引用。

      【讨论】:

        【解决方案8】:

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

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

        "由于native C++指针(*)和引用(&)不是托管引用,垃圾收集器不能自动更新它们指向的地址。解决这个问题,使用句柄声明器指定一个变量,垃圾收集器知道并可以自动更新。”

        (并且“native”是 I.M.H.O. 比“handle”更好的词,因为handle 可能是通过使用“Windows SDK”引入的更多词)

        【讨论】:

          猜你喜欢
          • 2010-12-29
          • 2012-02-08
          • 1970-01-01
          • 2010-09-29
          • 2011-04-18
          • 2012-04-30
          相关资源
          最近更新 更多