gcroot是什么意思?我在我正在阅读的代码中找到它。
答案 0 :(得分:17)
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中。
答案 1 :(得分:10)
当.NET垃圾收集器运行时,它通过执行可访问性分析来确定哪些对象仍在使用中。在查找对象的指针时只分析托管堆,因此如果您有从本机对象到托管对象的指针,则需要让垃圾收集器知道,因此它可以将其包含在可达性分析中,因此它可以如果目标在压缩过程中移动,则更新指针。
正如rstevens所说,.NET GCHandle
类是这样做的,而C ++ / CLI是面向C ++的GCHandle
包装器,它增加了类型安全性和方便的语法。