2012-12-30 8 views
9

Sytuacja:Co jeśli w destruktorze utworzę żywą referencję do obiektu?

  1. obiekt kwalifikuje się do GC
  2. GC rozpoczyna zbieranie
  3. połączenia GC destructor
  4. W destructor Ja, na przykład, dodać bieżący obiekt do kolekcji statycznej

W proces zbierania obiektu nie kwalifikuje się do GC i będzie kwalifikować się w przyszłości, ale w specyfikacji powiedział, że Finalize można wywołać tylko raz.

Pytania:

  1. wniosą sprzeciwu być zniszczone?
  2. zostanie sfinalizowana, aby zostać wezwanym w następnym GC?
+1

Do wyszukiwania dla .NET GC Zmartwychwstania, znajdziesz na przykład [ten artykuł] (http://msdn.microsoft.com/en-us/magazine/bb985010.aspx) –

Odpowiedz

12

obiekt będzie nie być zbierane śmieci - ale następnym razem, gdy kwalifikuje się ona do zbierania śmieci, Finalizer nie zostać uruchomiony ponownie, chyba że nazywają GC.ReRegisterForFinalize.

Przykładowy kod:

using System; 

class Test 
{ 
    static Test test; 

    private int count = 0; 

    ~Test() 
    { 
     count++; 
     Console.WriteLine("Finalizer count: {0}", count); 
     if (count == 1) 
     { 
      GC.ReRegisterForFinalize(this); 
     } 
     test = this; 
    } 

    static void Main() 
    { 
     new Test(); 
     Console.WriteLine("First collection..."); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 

     Console.WriteLine("Second collection (nothing to collect)"); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 

     Test.test = null; 
     Console.WriteLine("Third collection (cleared static variable)"); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 

     Test.test = null; 
     Console.WriteLine("Fourth collection (no more finalization...)"); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
    } 
} 

wyjściowa:

First collection... 
Finalizer count: 1 
Second collection (nothing to collect) 
Third collection (cleared static variable) 
Finalizer count: 2 
Fourth collection (no more finalization...) 
Powiązane problemy