2014-09-24 91 views
0

我有一個程序在其中分配了一個int數組,並且希望在調用GC.Collect()之後檢查它是否會被垃圾回收。在這個程序中,我分配一個int數組array1並保留一個WeakReference以檢查它是否在稍後被垃圾回收。我有一個名爲procedure的方法,它在其中分配一個新的本地數組(array2)並將array2分配給通過引用傳遞的輸入temp數組。此方法還分配弱引用ref1ref2以保存有關輸入temp數組和array2的信息。當我調用此方法時,我將array1傳遞給它,因此array1等於array2。一旦我退出該方法,我會致電GC.Collect()強制進行垃圾回收。調試器告知ref1ref2仍然有IsAlive屬性等於trueref3,它在main功能和參考array1實例化,告訴IsAlive屬性是垃圾回收後false,因此array1已被垃圾收集。2對同一對象的弱引用顯示不同的信息

不應該ref1,它引用array1,有IsAlive屬性等於false,就像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

ref1引用array2。 – krisdyson 2014-09-24 07:09:18

回答

2

我想你已經得到了你的變量它們指向之間的混淆。在您撥打GC.Collect(),array1,ref1,ref2的點處都指向過程()中創建的數組(array1是唯一有效的參考)。

通過您的代碼手動跟蹤每個值(在procedure()中創建的數組,Main()中創建的數組)以及每個點指向哪個變量。

您將會看到,在您創建procedure()中的兩個WeakReferences時,temp和array2指向相同的值(在同一方法中創建的數組)。在Main()中創建的WeakReference將是唯一指向在Main()中創建的數組的指針,因爲array1變量將由於ref而被更改爲通過procedure()指向另一個數組。

+0

我明白你的意思了。當我改變我的代碼,以便在調用過程()之後實例化ref3並將其設置爲引用現在等於array2的array1時,我得到所有3個具有IsAlive屬性的弱引用等於true。 我的另一個問題是 - 由於在過程中聲明瞭array2,並且在垃圾回收被強制的時候超出了範圍,所以不應該垃圾回收?所有這些弱引用的IsAlive屬性都等於true,所以它們引用的內容(array2 [])沒有被垃圾回收。 – user3623874 2014-09-24 07:59:50

+0

通過在procedure()中執行'temp = array2;'(temp是一個ref參數),您將Main()中聲明的變量指向數組,使其保持活動狀態。引用的值(如數組)永遠不會「超出範圍」 - 只有引用它們的變量。 – 2014-09-24 08:00:57