Clearコントロールを廃棄しないため、メモリリークが発生します。リンクから:
メモリからコントロールハンドルを削除することはできません。 メモリリークを防ぐには、Disposeメソッドを明示的に呼び出す必要があります。
ループ内で廃棄するので、インデックスを台無しに、あなたは別のリストにコントロールコレクションをコピーして、それらにForEach
ループを実行したり、後方For
ループを使用することができます。 (GCがそれを拾ったときに)メモリからコントロールを削除しますDispose
を呼び出す
for (int i = myTableLayoutPanelControls.Count - 1; i >= 0; --i)
myTableLayoutPanelControls[i].Dispose();
。これは、子コントロールのDispose
メソッドの呼び出しも処理します。
IDisposable
を実装するカスタムコントロールがある場合、またはbase
メソッドを呼び出すことなくDispose
メソッドをオーバーライドする場合は、1つのキャッチがあります。オブジェクトのDispose
メソッドでは、スコープ外のイベントの登録を解除する必要があります。そうしないと、その参照はあなたのオブジェクトを生かしています。
他のオブジェクトがそれらへの参照を保持していない場合はGCが行われます。 – Magnus
そうですが、Sub-Tablelayoutpanelはその子の参照を保持し、子は親の参照を保持しているのでしょうか?どのように私はGCがそれらを常に正しく削除することができます – Xaser