gpt4 book ai didi

c# - 垃圾收集器和循环引用

转载 作者:IT王子 更新时间:2023-10-29 03:47:14 24 4
gpt4 key购买 nike

考虑这两个类:

public class A
{
B b;
public A(B b) { this.b = b; }
}

public class B
{
A a;
public B() { this.a = new A(this); }
}

如果我有像上面那样设计的类,这些类的对象会被垃圾收集器 (GC) 收集吗?

假设我这样做:

void f()
{
B b = new B();
}

在这个方法中,我创建了一个名为 bB 实例,当方法返回时,b 超出范围,并且GC应该能够回收它,但是如果要回收它,它必须先回收a,它是B的成员,然后再回收a,需要先收集b,它是A的成员。它变成了圆形。所以我的问题是:这种循环引用是否会阻止 GC 收集对象?

  • 如果是,那么我们怎样才能避免这个问题呢?我们如何确保我们的类设计中没有循环引用?是否有任何工具(或编译器选项)可以帮助我们检测循环引用?
  • 如果不是,我们在哪里以及为什么使用 WeakReference类(class)?它的目的是什么?

最佳答案

.NET 垃圾收集器完全可以处理循环引用。垃圾收集器如何工作的非常高级 View 是......

  • 从局部变量、静态变量和 GC 固定对象开始。这些都收不到
  • 标记遍历这些对象的子对象可以到达的每个对象
  • 收集所有未标记的对象。

这允许很好地收集循环引用。只要它们中的任何一个都无法从已知不可收集的对象访问,那么循环引用本质上是无关紧要的。

注意:我意识到为了让这个答案简单直接,我遗漏了许多有趣的细节

关于c# - 垃圾收集器和循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8840567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com