对同一对象的 2 个弱引用显示不同的信息

本文关键字:显示 引用 信息 对象 | 更新日期: 2023-09-27 18:24:14

>我有一个程序,我在其中分配了一个 int 数组,并想在我调用 GC.Collect() 后检查它是否会被垃圾回收。在这个程序中,我分配了一个 int 数组array1并保留WeakReference,以便稍后检查它是否被垃圾收集。我有一个名为 procedure 的方法,它在其中分配一个新的本地数组 (array2 (,并将array2分配给通过引用传递的输入temp数组。此方法还分配弱引用ref1ref2,以保存有关输入temp数组和array2的信息。当我调用此方法时,我array1传递给它,因此array1等于array2。退出该方法后,我调用GC.Collect()来强制垃圾回收。调试器告诉ref1ref2仍然具有等于 true IsAlive属性。 ref3main 函数中实例化并引用array1,告诉IsAlive属性在垃圾回收后被false,所以array1已经被垃圾回收了。

引用array1ref1不应该像ref3(也引用array1(一样具有等于false IsAlive性质吗?

static WeakReference ref1;
static WeakReference ref2;
static WeakReference ref3;
const int max_size = 10;
public static void procedure(ref int []temp)
{
    int[] array2 = new int[max_size];
    temp = array2;
    for (int i = 0; i < max_size; i++)
        array2[i] = i * 2;
    ref1 = new WeakReference(temp);
    ref2 = new WeakReference(array2);
}
static void Main(string[] args)
{
    int []array1 = new int[max_size];
    ref3 = new WeakReference(array1);
    procedure(ref array1);
    //array1 = null;
    GC.Collect();
}

对同一对象的 2 个弱引用显示不同的信息

我认为您在变量和它们指向的值之间感到困惑。在你调用GC.Collect()array1ref1ref2都指向在 procedure(( 中创建的数组(array1是唯一活着的强引用(。

手动跟踪代码,跟踪每个值(在 procedure(( 中创建的数组,在 Main(( 中创建的数组(,以及每个点上哪个变量指向哪个变量。

您将看到,在 procedure(( 中创建两个 WeakReferences 时,temp 和 array2 指向相同的值(以相同方法创建的数组(。在 Main(( 中创建的弱引用将是唯一指向在 Main(( 中创建的数组的东西,因为由于refarray1变量将被更改为指向 procedure(( 指向另一个数组。