2016-12-23 19 views
-2

比較的単純な問題です。VB.Netのメモリからコントロールを正しく削除するには?

パネルにはテキストボックスがあり、すべて動的に作成されています。 ユーザーがテキストボックスの一部を入力してから、パネルを閉じます。

コードでは、私は行を使用します。

Me.Pnl_Main.Controls.Clear() 

これは問題なく機能し、パネルの内容は「削除」されます。

問題は、テキストボックスが同じ目的のために再作成されても、以前にあった値がまだ残っているということです。

残念ながら、私にとってはほとんどのUIはこのように作成され、必然的にメモリリークが発生します。

私の質問は、メモリから完全にコントロールを削除する適切な方法はありますか?または、すべてのテキスト値をNothingに設定するルーチンを実行する必要がありますか?

ありがとうございます。

+0

あなたが作成したテキストボックスへの参照は、 '.Clear()'を実行した後もどこかに存在するというのが問題だと思います。テキストボックスの同じインスタンス(以前のテキストが表示されている理由)を常に使用しているため、メモリリークの問題はないと思います。もちろん、テキストボックスはフォーム外で参照されますが、リークは可能です。テキストボックスを作成してパネルに追加するコードを表示できます – Fabio

+0

'Me.Pnl_Main.Controls.Clear()'の後に、textbox変数をnothingに設定できます。 –

+0

テキストボックスは実際に私が作ったユーザーコントロールの一部です(このようにして、大量のコントロールを動的に作成するときの時間を節約できます)。 –

答えて

-1

コードの一部がコントロールへの参照を保持している限り、メモリからはクリアされません。これらのコントロールへの参照をすべて削除する必要があります。これらのコントロールは、それらがメモリから削除することができますどこにも参照されていないが、彼らは最終的にはメモリから削除されたときに、あなたが実際にコントロールしていない提供

Me.Pnl_Main.Controls = Nothing 

。これは、メモリがいっぱいになったときに自動的に実行されるガベージコレクタによって行われます。

+0

これは文字通り何もしません。 VB.NETには何も設定されていません。元の質問のコードは正しいです、ボブは 'クリア'を呼び出す必要があります。彼が見逃している部分は、コレクション内の各コントロールを最初にループし、 'Dispose'メンバ関数を呼び出す必要があるということです。完了したら、コレクションを空にするために「クリア」を呼び出すことができます。 –

+0

この質問とそのリンクを参照してください:http://stackoverflow.com/questions/1969705/clear-controls-does-not-dispose-them-what-is-the-risk –

-1

オブジェクトを廃棄することは、特にメモリとは何の関係もありません。配置されたオブジェクトはすぐにメモリから削除することができますが、.NETはメモリが良好で準備ができているときにメモリを解放します。新しいメモリを割り当てることは、既存のメモリを再割り当てするよりもはるかに安いので、ほとんどの場合はそれが完了します。

+0

これは本当の並べ替えです。Disposeを呼び出すと、ガベージコレクタと何も関係がありません。管理されていないメモリを解放し、ガベージコレクタはマネージメモリを処理します。したがって、メモリリークを防ぐにはDispose *を呼び出すことが重要です。型がIDisposableを実装している場合、そのDisposeメソッドを呼び出す必要があります。そうしないと、リークします。 Controlクラスはさらに特別です(詳細については、複製を参照してください)。親から動的に削除する各コントロールのDisposeメソッドを必ず呼び出す*必要があります。答えを正しいものにする方法は、「廃棄」を「参照されていない」に置き換えることです。 –

関連する問題