문제

다음 코드가 있습니다.

 public class A
    {
        ~A()
        {
            Console.WriteLine("destructor");
        }
    }

 public static A Aref;
 static void Main(string[] args)
    {
        Aref = new A();
        int gen = GC.GetGeneration(Aref);
        Aref = null;
        GC.Collect(gen, GCCollectionMode.Forced);
        Console.WriteLine("GC done");

    }

나는 최종화기 방법이 gc.collect에 대한 나의 호출에 호출 될 것이라고 생각했는데, 그렇지 않습니다.

누구든지 이유를 설명 할 수 있습니까?

도움이 되었습니까?

해결책

최종화기는 이전에 호출되지 않았습니다 GC.Collect() 보고. 파이널이저는 별도의 스레드에서 실행됩니다. GC.WaitForPendingFinalizers().

다른 팁

최종화기는 예제에서 컬렉션 중에 호출되지 않으므로 최종화 가능한 대기열에 의해 루트가 계속 발생하고 있습니다. 그러나 최종화로 예정되어 있으며 다음 쓰레기 수집 중에 수집됩니다.

최종화기가 포함 된 유형의 인스턴스가 수집되도록하려면 이와 같은 두 개의 컬렉션을 수행해야합니다.

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

그러나 일반적으로 당신은 전화해서는 안됩니다 Collect() 스스로 방법.

GC가 수집하도록 요청하더라도,이 특정 대상이 파괴 될지 확신 할 수 없다 (그 순간에 수집 된 세대에있을 수 없기 때문에).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top