【问题标题】:Understanding gcroot了解 gcroot
【发布时间】:2011-05-15 23:22:41
【问题描述】:

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

gcroot 提供句柄到 垃圾收集堆

还有那个

句柄本身不是垃圾 收集。

我不明白的是:

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

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

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

【问题讨论】:

    标签: .net c++-cli


    【解决方案1】:

    垃圾收集不仅会删除未引用的对象,还会在仍被引用的对象周围移动,例如对可用内存池进行碎片整理。当文章谈到对象在 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 打扫房子时,地球都会在你脚下移动。

    【讨论】:

    • 是的 - 那部分肯定让我感到困惑。您的其余答案描绘了一幅更清晰的画面。谢谢。 +1
    猜你喜欢
    • 2011-09-24
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多