了解gcroot

Set*_*eth 25 .net c++-cli

我一直在阅读这篇文章,以了解gcroot模板.我明白了

gcroot为垃圾收集堆提供句柄

然后

句柄本身不是垃圾收集.

我不明白的是以下内容:

当CLR对象与垃圾收集堆一起移动时,句柄将返回该对象的新地址.在将变量分配给gcroot模板之前,不必固定该变量.

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

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

Sam*_*uce 31

垃圾收集不仅会删除未引用的对象,还会移动仍然引用的对象,例如对可用内存池进行碎片整理.当关于在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. */
Run Code Online (Sandbox Code Playgroud)

有关固定的详细信息,请参阅此文章.

观察:文章可能有拼写错误.如果它说"在垃圾收集堆内"而不是"用垃圾收集堆",那会改善你的理解吗?文章中的措辞使得听起来就像每当GC清理房屋时,地球会在你的脚下移动.