2009-08-06 51 views
1

空の子フォームをメニューから開くmdi親フォームを持つ空のアプリケーションを作成しました。ブランクの子フォームを持つmdiのメモリリーク

子フォームの親フォームがmdiに設定されていると、システムはメモリを解放しないため、リークが発生します。

親フォームが設​​定されていない場合、子フォームは削除されます。

この明らかなメモリリークがなぜ解決できるのか誰にも分かりますか?

私はantsメモリプロファイラを使用しています。

ボブ。

+0

..唯一のコードは次のようになり、メニュークリックに添付されています 薄暗いFRM新しい赤ちゃん frm.MdiParentは frm.Show(= Meのとおり) ので、自分で追加したイベントハンドラはありません。 –

答えて

0

オブジェクトのイベントを購読している場合、ガベージコレクションされない可能性があります。そのオブジェクトを参照するものがないことを確認する必要があります。

+0

- イベントは関連付けられていません - 上記のコメントには使用されたコードが含まれています(これはかなりバニラです)。 –

1

メモリリークの最も一般的な原因は、適切にリリースされていないイベントだと思いますが、あなたはそれを探したと言いました。

コードを見ずに漏れがどこにあるのか正確に知るのは難しいです。 .NET Memory Profilerを使用することをお勧めします。私はこれまでに使ったことがあり、Antより優れているようです。

+0

antsプロファイラーはかなり良いです - 実際のアプリケーションでリークを見つけるためにそれを使用しています。しかし、このツールを介して私は、私はそのハンドルを失うために基本的なウィンドウmdiアプリケーションを取得することができないことがわかった。私はメモリをリークしないようにウィンドウmdiを取得できない場合、私は複雑なアプリケーションを修正するチャンスがないと考えた。上記の例では、リリースコールが必要ですか? –

+0

メモリが本当に解放される唯一の方法は、mdiの子フォームへの呼び出しからme.parent = meを削除する場合です。これは、フォームがmdiの子にならないようにします。 –

+0

私は実際のアプリケーションでも.NETメモリプロファイラを使用していましたが、紛失したデータへの参照がフレームワークobj内にある場合でもリークを見つけることができました。 とにかく、あなたがフレームワークにバグを見つけた可能性は高いですが、そうは思わないでしょう。問題は私がそれを再現できないことです。したがって、解決策や回避策が見つかった場合、それを見つけるのは非常に難しいです。コードを私たちと共有できますか? – jpbochi

1

これはSP1で導入されたSP2フレームワークのバグであるようです。

だけで、.NETメモリプロファイラのメーカー、次のブログ記事のサイテックソフトウェアを読む:あなたのMDI親フォームに次のコードを追加し、問題を解決するには
http://www.scitech.se/blog/index.php/2008/03/20/minor-memory-leak-introduced-in-net-framework-20-sp1/

を:

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. 
    } 
} 

私がテストしましたこれはANTSメモリプロファイラを使用して、私の場合は問題を解決しました。ただ、これは完全に空白MDIで明確にする

関連する問題