c++/cli 中的 gcroot

Posted

技术标签:

【中文标题】c++/cli 中的 gcroot【英文标题】:gcroot in c++/cli 【发布时间】:2011-02-15 15:00:56 【问题描述】:

gcroot 是什么意思?我在我正在阅读的代码中找到了它。

【问题讨论】:

第一个谷歌链接:msdn.microsoft.com/en-us/library/481fa11f(v=vs.80).aspx 第一个谷歌链接失效了,谷歌把我带到了这里。 【参考方案1】:

gcroot 是一个 C++/cli 模板类,可以轻松地在 C++/cli 类中保存托管类型。

例如,您可以拥有以下内容:

#include <msclr/gcroot.h>
using namespace msclr;

class Native 
  public:
    Native(Object ^obj) :
      netstring(obj->ToString())  // Initializing the gcroot<String ^>
    
    ~Native() 
    
    void Print() 
      array<Char> ^chars = netstring->GetChars(); // Dereferencing the gcroot<String ^>
      _wprintf("netstring is:");
      if (chars->Length > 0) 
        pin_ptr<Char> charptr = &(chars[0]);
        _wprintf("%s", (wchar_t const *)charptr);
      
    
  private:
    gcroot<String ^> netstring;
;

gcroot 充当对托管对象或值类型实例的引用,并在复制对象或值类型实例时完成所有工作。 通常您需要使用 GCHandle 和 .NET 框架的一些 C 函数。这一切都封装在 gcroot 中。

【讨论】:

【参考方案2】:

当 .NET 垃圾收集器运行时,它会通过进行可达性分析来确定哪些对象仍在使用中。在查找指向对象的指针时只分析托管堆,因此如果您有从本机对象指向托管对象的指针,则需要让垃圾收集器知道,以便它可以将其包含在可达性分析中,因此它可以如果目标在压缩期间移动,则更新指针。

正如 rstevens 所说,.NET GCHandle 类执行此操作,而 C++/CLI 是 GCHandle 的面向 C++ 的包装器,它增加了类型安全性和方便的语法。

【讨论】:

以上是关于c++/cli 中的 gcroot的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C# 访问 C++/CLI 中的类?

混合模式 C++/CLI 崩溃:atexit 中的堆损坏(静态析构函数注册)

MFC dll 中的访问冲突(用 C++/CLI 包装)从 C# 程序开始

C++/CLI 中的“_in_”和“_in_opt_”是啥意思?

C++/CLI 库中的早期终结和内存泄漏

使用 Mutex 的 C++/CLI 中的单实例应用程序