.net 理解gcroot

.net 理解gcroot,.net,c++-cli,.net,C++ Cli,我一直在阅读这篇文章来理解gcroot模板。我理解 gcroot为 垃圾收集堆 那 手柄本身不是垃圾 收集 我不明白的是: 当CLR对象随 垃圾收集堆,句柄 将返回 对象变量不必是 在将其指定给对象之前锁定 gcroot模板 这是否意味着垃圾收集器将删除CLR对象,即使存在引用该对象的gcroot句柄 它所指的“新地址”是什么?“变量在分配给gcroot模板之前不必固定”是什么意思?垃圾收集不仅删除未引用的对象,还移动仍被引用的对象,例如对可用内存池进行碎片整理。当文章谈到CLR堆中移动的对象时

我一直在阅读这篇文章来理解gcroot模板。我理解

gcroot为 垃圾收集堆

手柄本身不是垃圾 收集

我不明白的是:

当CLR对象随 垃圾收集堆,句柄 将返回 对象变量不必是 在将其指定给对象之前锁定 gcroot模板

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


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

垃圾收集不仅删除未引用的对象,还移动仍被引用的对象,例如对可用内存池进行碎片整理。当文章谈到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. */
Object^obj=gcnew;
引脚_ptr pinted=obj;/*只要固定在范围内,obj就不会因GC而移动*/
/*在这里进行互操作,在DLL中传递到本机代码,等等*/
有关固定的详细信息,请参阅


观察:文章可能有打字错误。如果它说的是“在垃圾收集堆内”,而不是“在垃圾收集堆内”,这会提高您的理解吗?这篇文章的措辞让人觉得每当GC打扫房子的时候,地球都会在你脚下移动。

是的,那部分确实让我困惑。你剩下的答案描绘了一幅更清晰的画面。谢谢+1.