我一直在阅读article以了解gcroot模板。我了解
然后
我不明白的是以下内容:
这是否意味着即使有gcroot句柄引用该对象,垃圾收集器也会删除CLR对象?
它指的是“新地址”?这意味着“在将变量分配给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. */
有关固定的更多信息,请参见this article。
观察:文章可能有错字。如果它说的是“在垃圾收集堆中”而不是“在垃圾收集堆中”,那是否会增进您的理解?文章中的措辞方式使人听起来好像每当GC打扫房子时地球都会在您的脚下移动。