尝试说明问题的一些近似代码,何时标记为可用于垃圾收集的对象 -
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对象被标记为垃圾回收。
是对的吗?感谢您的任何见解...
答案 0 :(得分:6)
是吗?
是的,当main
方法完成执行时tb
变量超出范围(当然,除非你将一些指针添加到另一个具有更大范围的变量)和tb
有资格进行垃圾收集。当然,当实际的垃圾收集发生时,你无法控制。它可能在main
方法完成执行后很晚才发生。这是决定最佳时刻的CLR。因此,如果在main
方法完成后不立即回收所有分配的内存,请不要感到惊讶。