2011-02-15 60 views
10

gcroot是什么意思?我在我正在阅读的代码中找到它。gcroot in C++/cli

+1

1st google链接:http://msdn.microsoft.com/en-us/library/481fa11f(v=vs.80).aspx – 2011-02-15 15:05:17

回答

15

gcroot是一个C++/cli模板类,它简化了C++/cli类中的托管类型。

例如,您可以有以下几种:

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中。

9

当.NET垃圾收集器运行时,它通过进行可达性分析来确定哪些对象仍在使用中。在查找指向对象的指针时,只分析托管堆,因此如果您有一个从本地对象指向托管对象的指针,则需要知道垃圾收集器,因此它可以将其包含在可达性分析中,因此它可以如果目标在压缩过程中移动,则更新指针。根据rstevens的说法,.NET GCHandle类可以做到这一点,而C++/CLI是面向C++的GCHandle包装器,它增加了类型安全性和方便的语法。