我一直在阅读此article以了解gcroot模板。我明白了
gcroot提供了句柄 垃圾收集堆
那个
手柄本身不是垃圾 收集。
我不明白的是:
当CLR对象移动时 垃圾收集堆,句柄 将返回的新地址 宾语。变量不一定是 在分配给a之前固定 gcroot模板。
这是否意味着即使存在引用该对象的gcroot句柄,垃圾收集器也会删除CLR对象?
它所指的“新地址”是什么?那么“变量在分配给gcroot模板之前不必固定”是什么意思?
答案 0 :(得分:30)
垃圾收集不仅会移除未引用的对象,还会移动仍然被引用的对象,例如:对可用内存池进行碎片整理。当文章讨论在CLR堆中移动的对象时,它可能会说“当垃圾收集移动仍然引用的对象时,gcroot句柄将自动更新为仍然指向CLR对象。”
您可以使用pin_ptr
关键字阻止GC移动对象,如下所示:
Object ^obj = gcnew <something>;
pin_ptr pinned = obj; /* obj won't move due to GC as long as pinned is in scope. */
/* do something interop-y here, pass to native code in a DLL, etc. */
有关固定的详情,请参阅this article。
观察:文章可能有拼写错误。如果它说“在垃圾收集堆内”而不是“用垃圾收集堆”,那会改善你的理解吗?文章中的措辞使得听起来就像每当GC清理房屋时,地球会在你的脚下移动。