2013-03-23 8 views
10

私はTableLayoutPanelを使用していますが、これは他のTablelayoutPanelsで動的に埋められています。Controls.Clear()はどのくらい深くクリーンアップしますか?

を動的に入力したTableLayoutPanelに電話するとどうなりますか?明らかに、すべてのサブレイアウトは削除されますが、その子はどうですか?彼らは適切に処分されているのですか、あるいはメモリリークを恐れる必要がありますか?

Clear()を呼び出す前に、子の子を再帰的に削除する必要がありますか?

+1

他のオブジェクトがそれらへの参照を保持していない場合はGCが行われます。 – Magnus

+0

そうですが、Sub-Tablelayoutpanelはその子の参照を保持し、子は親の参照を保持しているのでしょうか?どのように私はGCがそれらを常に正しく削除することができます – Xaser

答えて

16

Clearコントロールを廃棄しないため、メモリリークが発生します。リンクから:

メモリからコントロールハンドルを削除することはできません。 メモリリークを防ぐには、Disposeメソッドを明示的に呼び出す必要があります。

ループ内で廃棄するので、インデックスを台無しに、あなたは別のリストにコントロールコレクションをコピーして、それらにForEachループを実行したり、後方Forループを使用することができます。 (GCがそれを拾ったときに)メモリからコントロールを削除しますDisposeを呼び出す

for (int i = myTableLayoutPanelControls.Count - 1; i >= 0; --i) 
    myTableLayoutPanelControls[i].Dispose(); 

。これは、子コントロールのDisposeメソッドの呼び出しも処理します。

IDisposableを実装するカスタムコントロールがある場合、またはbaseメソッドを呼び出すことなくDisposeメソッドをオーバーライドする場合は、1つのキャッチがあります。オブジェクトのDisposeメソッドでは、スコープ外のイベントの登録を解除する必要があります。そうしないと、その参照はあなたのオブジェクトを生かしています。

1

ご質問には多少の混乱があります。 Clear()は参照を削除し、オブジェクトはガベージコレクタによって収集されます。

しかし、disposeという単語も使用しています。クリアされたオブジェクトは、Disposeメソッドが呼び出されるという意味で、ではなく、となります。

これらのオブジェクトをもう使用しておらず、Disposeが呼び出されたければ、自分で行う必要があります。

+0

さて、それでは質問は私がもう使用していないすべてのオブジェクトにdisposeを呼ぶべきですか?私はDisposeメソッドが今プログラムにとって重要な何かを考えることができませんでした。また、私の以前のコメントからの質問は、親と子供がお互いに参照するように、GCがそれらを収集するでしょうか? – Xaser

+0

私は上記のコメント - 研究を投稿する前に何をすべきかをしました。 MSDNの権限があれば、Disposeメソッドを明示的に呼び出すことができ、GCが暗黙的にfinalizeメソッド(avail。)を使用している場合、アンマネージリソースを解放することができます。しかし、keyboardPによると、Clearはすべての参照をクリアしないので、Disposeを明示的に呼び出す必要があります。 – Xaser

+0

@Xaser 'Clear'は、コントロール内部のすべての参照をクリーンアップします。コード内にある参照には影響しません。'Finalize'は呼び出されることは保証されていないので、管理されていないすべてのリソースがクリーンアップされていることを確認したい場合は、' Dispose'を呼び出さなければなりません。 – clearpath

関連する問題