C#内存/分配清理

时间:2012-10-18 16:51:29

标签: c# memory-management garbage-collection

尝试说明问题的一些近似代码,何时标记为可用于垃圾收集的对象 -

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 个答案:

答案 0 :(得分:6)

  

是吗?

是的,当main方法完成执行时tb变量超出范围(当然,除非你将一些指针添加到另一个具有更大范围的变量)和tb有资格进行垃圾收集。当然,当实际的垃圾收集发生时,你无法控制。它可能在main方法完成执行后很晚才发生。这是决定最佳时刻的CLR。因此,如果在main方法完成后不立即回收所有分配的内存,请不要感到惊讶。