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

时间:2014-09-24 07:00:59

标签: c# arrays scope garbage-collection weak-references

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

不应该array1引用IsAlivefalse属性等于ref3,就像array1一样(也引用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(); } 1}})吗?

{{1}}

1 个答案:

答案 0 :(得分:2)

我认为您在变量和他们指向的之间感到困惑。在您致电GC.Collect()时,array1ref1ref2都指向在过程()中创建的数组(array1是唯一的强引用活的)。

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

您将看到在procedure()中创建两个WeakReferences的点,temp和array2指向相同的值(在同一方法中创建的数组)。在Main()中创建的WeakReference将是唯一指向Main()中创建的数组的东西,因为array1变量将被更改为指向另一个数组by procedure(),因为{{1 }}