2012-10-18 38 views
1

一些近代碼試圖說明的問題,是當對象標記爲可被垃圾收集 -C#存儲器/分配清理

class ToyBox 
{ 
    public List<Toy> Toys = new List<Toy>(); 
} 
class Factory 
{ 
    public ToyBox GetToys() 
    { 
     ToyBox tb = new ToyBox(); 
     tb.Toys.Add(new Toy()); 
     tb.Toys.Add(new Toy()); 

     return tb; 
    } 
} 
main() 
{ 
    ToyBox tb = Factory.GetToys(); 
    // After tb is used, does all the memory get cleaned up when tb goes out of scope? 
} 

Factory.GetToys()分配內存。內存何時清理?我假設當Factoy.GetToys()返回ToyBox對象時,ToyBox對象的唯一引用是main()中的引用,所以當該引用超出作用域時,Toy對象和ToyBox對象被標記爲垃圾收集。
是嗎?感謝您的任何見解...

+1

'Factory.GetToys();'?那不工作的人。你也需要工廠的監督。 – DarthVader

+3

@DarthVader他**確實**說它是*附近的代碼*(又名僞代碼)... – Yuck

+0

人們無法分辨何時tb會被清理乾淨。也許有時在未來,如果超出範圍,也許永遠不會。取決於垃圾收集器(通常是非確定性的)。 – Simon

回答

6

這是正確的嗎?

是的,當main方法執行完畢tb變量超出範圍(當然,除非你一些指針到它具有更大範圍的另一個變量)和tb是符合垃圾回收。當然,當真正的垃圾收集發生在你的控制之外。在main方法結束執行後可能會發生很多事情。這是CLR決定最佳時刻。因此,如果不在main方法結束後立即收回所有分配的內存,請不要感到驚訝。

+0

你可能意思是'合格'。 – Simon

+2

+1符合垃圾收集條件。 – DarthVader

+0

我讀爲合格:) – DarthVader