了解gcroot

时间:2010-11-26 00:49:38

标签: .net c++-cli

我一直在阅读此article以了解gcroot模板。我明白了

  

gcroot提供了句柄   垃圾收集堆

那个

  手柄本身不是垃圾   收集。

我不明白的是:

  

当CLR对象移动时   垃圾收集堆,句柄   将返回的新地址   宾语。变量不一定是   在分配给a之前固定   gcroot模板。

这是否意味着即使存在引用该对象的gcroot句柄,垃圾收集器也会删除CLR对象?

它所指的“新地址”是什么?那么“变量在分配给gcroot模板之前不必固定”是什么意思?

1 个答案:

答案 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清理房屋时,地球会在你的脚下移动。