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 に答える