【问题标题】:C# memory / allocation cleanupC# 内存/分配清理
【发布时间】:2012-10-18 16:51:29
【问题描述】:

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

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

【问题讨论】:

  • Factory.GetToys(); ??那不工作的人。你也需要工厂的实例。
  • @DarthVader 他确实说这是接近代码(又名伪代码)...
  • 无法判断 tb 何时会被清理干净。也许有时在未来,如果超出范围之后,也许永远不会。取决于垃圾收集器(通常是不确定的)。
  • Simon -- 但是当 tb 超出范围时,它会被标记为 GC,对吧?也就是说,不需要采取明确的措施来确保不再引用 ToyBox 对象或任何 Toy 对象,对吗?

标签: c# memory-management garbage-collection


【解决方案1】:

对吗?

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

【讨论】:

  • 您的意思可能是“合格”。
  • 对不起,我的英语很烂。感谢您的意见。
  • @DarthVader,是的,我愿意。幸运的是 StackOverflow 是编程相关的问答网站,不像 english.stackexchange.com 我会收集负面声誉:-)
  • +1。请注意,此时绝对不会发生任何事情 - GC 不会立即开始收集对象。 “易读”意味着 - 何时/如果 GC 将启动此特定对象可以被垃圾收集(如果它属于当前收集的一代)。
  • 谢谢大家 - 我想确认不需要做任何明确的事情来清除对 ToyBox 对象或 Toy 对象的任何引用...
猜你喜欢
  • 2010-10-15
  • 2018-09-05
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 2015-07-23
  • 1970-01-01
相关资源
最近更新 更多