メニューから空白の子フォームを開くmdi親フォームを使用して空白のアプリケーションを作成しました。
子フォームの親フォームがmdiに設定されている場合、システムがメモリを解放していないように見えるため、リークが発生します。
親フォームが設定されていない場合、子フォームは削除されます。
この明らかなメモリリークを解決できる理由を誰かが知っていますか?
私はアリのメモリプロファイラーを使用しています。
ボブ。
メニューから空白の子フォームを開くmdi親フォームを使用して空白のアプリケーションを作成しました。
子フォームの親フォームがmdiに設定されている場合、システムがメモリを解放していないように見えるため、リークが発生します。
親フォームが設定されていない場合、子フォームは削除されます。
この明らかなメモリリークを解決できる理由を誰かが知っていますか?
私はアリのメモリプロファイラーを使用しています。
ボブ。
これは、SP1で導入された.net Framework 2.0のバグであり、SP2でもまだ存在しているようです。
.net Memory ProfilerのメーカーであるSciTechソフトウェアの次のブログ投稿を読んでください:
http ://www.scitech.se/blog/index.php/2008/03/20/minor-memory-leak-introduced-in-net-フレームワーク-20-sp1/
この問題を修正するには、MDI親フォームに次のコードを追加します。
protected override void OnMdiChildActivate(EventArgs e)
{
// Code from http://www.scitech.se/blog/index.php/2008/03/20/minor-memory-leak-introduced-in-net-framework-20-sp1/
base.OnMdiChildActivate(e);
try
{
typeof(Form).InvokeMember("FormerlyActiveMdiChild",
BindingFlags.Instance | BindingFlags.SetProperty |
BindingFlags.NonPublic, null,
this, new object[] { null });
}
catch (Exception)
{
// Something went wrong. Maybe we don't have enough
// permissions to perform this or the
// "FormerlyActiveMdiChild" property no longer
// exists.
}
}
これをANTSMemoryProfilerでテストしたところ、私の場合は問題が修正されました。
1つの可能性は、オブジェクトのイベントをサブスクライブしている場合、ガベージコレクションされないことです。そのオブジェクトを参照しているものがないことを確認する必要があります。