2014-09-24 1 views
0

int 배열을 할당하고 GC.Collect()을 호출 한 후 가비지 수집 여부를 확인하려는 프로그램이 있습니다. 이 프로그램에서는 int 배열 array1을 할당하고 나중에 가비지 수집 여부를 확인하기 위해 WeakReference을 유지합니다. 나는 (array2) 새로운 로컬 배열을 할당하고 참조로 전달 된 temp 배열에 array2을 할당하는 procedure이라는 메서드를 가지고 있습니다. 이 방법은 또한 약한 참조 ref1ref2에 입력 temp 배열과 array2에 대한 정보를 할당합니다. 이 메서드를 호출하면 array1이 전달되므로 array1array2이됩니다. 이 메서드를 종료하면 가비지 수집을 강제로 GC.Collect() 호출합니다. 디버거는 ref1ref2이 여전히 IsAlive 속성이 true과 같다고 말합니다. main 함수에서 인스턴스화되고 array1을 참조하는 ref3은 가비지 수집 후에 IsAlive 속성이 false이라고 알려주기 때문에 array1은 이미 가비지 수집되었습니다.동일한 객체에 대한 2 개의 약한 참조가 서로 다른 정보를 표시합니다.

, array1를 참조하는,하지 ref1할까요 마찬가지로 ref3 (도 array1를 참조하는) 수행, falseIsAlive 특성과 동일 있나요?

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

답변

2

나는 당신이 당신의 변수가치가 가리 사이에 혼동 왔 생각합니다. 당신이 GC.Collect()이라고 부르는 지점에서, array1, ref1, ref2은 모두 절차()에서 생성 된 배열을 가리키고 있습니다 (array1은 유일하게 강력한 참조 부호입니다).

각 값 (프로 시저()에서 생성 된 배열, Main()에서 생성 된 배열)을 추적하고 모든 점에서 어떤 변수 점을 추적하는지 코드를 통해 추적합니다.

procedure()에서 두 WeakReferences를 생성 할 때 temp와 array2가 같은 값 (동일한 메소드에서 생성 된 배열)을 가리킨다는 것을 알 수 있습니다. array1 변수가 ref로 인해 procedure()에 의해 다른 배열을 가리 키도록 변경되므로 Main()에서 작성된 WeakReference가 Main()에서 작성된 배열을 가리키는 유일한 것입니다.

+0

내가 무슨 뜻인지 알았어. procedure()가 호출되고 array2와 같은 reference1을 참조하도록 ref3이 인스턴스화되도록 코드를 변경했을 때 IsAlive 속성이 true 인 3 개의 weak 참조가 모두 나타납니다. 다른 질문은 - 배열 2가 프로 시저에서 선언 되었기 때문에 가비지 수집이 강제 실행될 때까지 범위를 벗어 났으므로 가비지 수집을해서는 안됩니까? 이러한 모든 약한 참조는 IsAlive 속성이 true와 동일하므로 참조하는 내용 (array2 [])은 가비지 수집되지 않았습니다. – user3623874

+0

procedure() (temp는 ref 인수)에서'temp = array2;'를 사용하여 Main()에서 선언 된 변수를 배열을 가리 키도록 변경하여 활성 상태로 유지합니다. 참조 된 값 (배열과 같은)은 결코 범위를 벗어나지 않습니다 - 참조하는 변수 만 참조하십시오. –

관련 문제