1

一些接近代码试图说明这个问题,什么时候标记为可用于垃圾收集的对象 -

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 对象标记为垃圾回收.
那正确吗?感谢您的任何见解...

4

1 回答 1

6

那正确吗?

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

于 2012-10-18T16:52:55.773 回答