引用自 (在 C# 中安全,在 C++ 中不安全,简单返回指针/引用,答案 3) 埃里克·利珀特 (Eric lippert)。
另请注意,并不是对 Person 对象的任何引用使其保持活动状态。引用必须是 root 的。您可以有两个相互引用但无法访问的 Person 对象;事实上,每个人都有一个参考并不能让他们保持活力;参考文献之一必须是 root 的。
我不明白,有人可以解释一下什么是根引用吗?
这意味着GC根。
通读一下本文,也许这会有助于你的理解:
GC 根本身并不是对象,而是对对象的引用。 GC 根引用的任何对象将在下一次垃圾回收中自动存活。 .NET 中有四种主要的根:
A 当前正在运行的方法中的局部变量被认为是GC根。这些变量引用的对象始终可以通过声明它们的方法立即访问,因此必须保留它们。这些根的生命周期取决于程序的构建方式。在调试版本中,只要方法在堆栈上,局部变量就会持续存在。在发布版本中,JIT 能够查看程序结构以计算出执行过程中变量可以被方法使用的最后一点,并在不再需要时将其丢弃。此策略并不总是使用,可以关闭,例如,通过在调试器中运行程序。
静态变量也始终被视为 GC 根。它们引用的对象可以随时由声明它们的类(或者程序的其余部分,如果它们是公共的)访问,因此 .NET 将始终保留它们。声明为“线程静态”的变量只会在该线程运行时持续存在。
If 托管对象通过互操作传递到非托管 COM+ 库,那么它也会成为一个带有引用计数的GC根。这是因为 COM+ 不进行垃圾收集:相反,它使用引用计数系统;一旦 COM+ 库通过将引用计数设置为 0 来完成对象的处理,它就不再是 GC 根并可以再次被收集。
If 一个对象有一个终结器,当垃圾收集器决定它不再“活动”时,它不会立即被删除。相反,它会成为一种特殊的根,直到 .NET 调用终结器方法。这意味着这些对象通常需要多次垃圾收集才能从内存中删除,因为它们在第一次被发现未使用时将继续存在。
(强调我的)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)