对同一对象的 2 个弱引用显示不同的信息
本文关键字:显示 引用 信息 对象 | 更新日期: 2023-09-27 18:24:14
>我有一个程序,我在其中分配了一个 int 数组,并想在我调用 GC.Collect()
后检查它是否会被垃圾回收。在这个程序中,我分配了一个 int 数组array1
并保留WeakReference
,以便稍后检查它是否被垃圾收集。我有一个名为 procedure
的方法,它在其中分配一个新的本地数组 (array2
(,并将array2
分配给通过引用传递的输入temp
数组。此方法还分配弱引用ref1
和ref2
,以保存有关输入temp
数组和array2
的信息。当我调用此方法时,我array1
传递给它,因此array1
等于array2
。退出该方法后,我调用GC.Collect()
来强制垃圾回收。调试器告诉ref1
,ref2
仍然具有等于 true
IsAlive
属性。 ref3
在 main
函数中实例化并引用array1
,告诉IsAlive
属性在垃圾回收后被false
,所以array1
已经被垃圾回收了。
引用array1
的ref1
不应该像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();
}
我认为您在变量和它们指向的值之间感到困惑。在你调用GC.Collect()
、array1
、ref1
、ref2
都指向在 procedure(( 中创建的数组(array1
是唯一活着的强引用(。
手动跟踪代码,跟踪每个值(在 procedure(( 中创建的数组,在 Main(( 中创建的数组(,以及每个点上哪个变量指向哪个变量。
您将看到,在 procedure(( 中创建两个 WeakReferences 时,temp 和 array2 指向相同的值(以相同方法创建的数组(。在 Main(( 中创建的弱引用将是唯一指向在 Main(( 中创建的数组的东西,因为由于ref
,array1
变量将被更改为指向 procedure(( 指向另一个数组。