次のようなものがあるとしましょう:
public class Item
{
public string Code;
public List<string> Codes = new List<string>();
}
private void SomeMethod()
{
List<Item> Items = new List<Item>();
for (int i = 0; i < 10; i++)
{
Item NewItem = new Item();
NewItem.Code = "Something " + i.ToString();
NewItem.Codes.Add("Something " + i.ToString());
Items.Add(Item);
}
//Do something with Items
}
後でリスト内のアイテムにアクセスする必要があるため、アイテムをインスタンス化し、解放していません (大まかな例)。
私が疑問に思っているのは、SomeMethod()
の実行がいつ終了したかということです。アイテム (およびその内容 - List<> を含む) が逆参照され、ガベージ コレクターが実行時にメモリをクリーンアップできるようになりますか? 基本的に、コードのこのセクションでメモリ リークが発生するか、SomeMethod()
処理が終了したときにすべてを参照解除する必要があります。
私の理解では、オブジェクトへの参照を何も保持していない場合、ガベージコレクションが行われるため、このコードは問題ないはずですが、正しく理解していることを確認したかっただけです。
編集:
オブジェクトの 1 つを追加すると、Items
まだスコープ内にある別のリスト (たとえば、グローバル リスト) に保持されます。何が起こるでしょうか?