gcroot in c ++/cli

lit*_*tuk 12 c++-cli

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

mmm*_*mmm 18

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;
};
Run Code Online (Sandbox Code Playgroud)

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


Ben*_*igt 10

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

正如rstevens所说,.NET GCHandle类就是这样做的,而C++/CLI是一个面向C++的包装器,GCHandle它增加了类型安全性和方便的语法.