2011-12-04 11 views
2

私は、DelphiにReportMemoryLeaksOnShutdownというグローバル変数があることを最近発見しました。これは、Trueに設定すると、アプリケーションが終了したときにメモリリークが検出されます。私は自分のアプリケーションを閉じたときに今、それはメモリリークの多くを拾っているReportMemoryLeaksOnShutdown := True;メモリリークの修正

を置くプロジェクトソースからそうWhat is the best tool to detect memory leaks in Delphi

:私は別の関連問題についていくつかのコメントを読んでから、その情報を見つけました。私の直ちに考えられるのは、作成されたオブジェクトが正しく解放されていることを確認することです(try..finally..freeなど)。

私はコードを去り、漏れがどこから来ているのか分かりませんでした。今度はそれらを見つける必要があります。アプリケーションが終了したときにメモリーリークが報告された場合、メモリリーク実行時にサイズが大きくなり、悪いです!

上記のリンクから、Eureka Logなどのサードパーティツールが推奨されていました。問題のある領域を見つけて修正するためのIDEとデバッガを使用する方法はありますか?私は約6メモリリークを取り除くことに成功し

UPDATE

、私はそれがMDIチャイルズをどうするわかりました。子はリストボックスにいくつかのポインタデータを保持しています。メインアプリケーションが終了しているとき、子が正しく解放されていない場合、これは修正されました。

私は今、これらの2つのエラーが残っています:

enter image description here

は、私は、デバッガを提案するかもしれないこの記事http://fgaillard.com/2011/02/when-the-debugger-leaks/が私の上記のエラーで故障しているましたか?

+0

リコールリークはありませんが、アプリケーションが終了するまでに割り当てられた静的オブジェクトがまだメモリに残っていることがあります。 – AlexTheo

+5

[how-to-get-a-stack-trace-from-fastmm](http://stackoverflow.com/questions/1130454/how-to-get-a-stack-trace-from-fastmm)を読んでください。 –

+0

最初に注意しなければならないのは、TComponentベースのオブジェクト(コントロールを含む)が親コントロールを常にコンストラクタに渡すように作成されている場合、TComponentベースのオブジェクトについて心配する必要がないことです。 Delphiはこれらをあなたのためにリリースします。 TPersistentまたはTObject子孫がある場合は、これらを手動で解放する必要があります。リークレポートダイアログは、リークの原因となったクラス名を教えてください(SHOULD)。 – LaKraven

答えて

17

まず、the full version of FastMMを取得してください。それには、FullDebugModeのようないくつかの追加機能があります。 FullDebugModeと、コンパイラオプションで定義された 'LogMemoryLeaksToFile'設定、およびEXEと同じフォルダにあるFullDebugMode DLLを使用してプロジェクトを再構築します。これにより、ダイアログボックスに加えて、プログラムのshtudownでのメモリリークに関する詳細情報を含むファイルが生成されます。ここで最も有用な情報は、各割り当ての部分的なスタックトレースです。

この情報を取得したら、メモリリークの修正を開始できます。オブジェクトの所有権は、一般的にはツリーのように見えます。つまり、あるオブジェクトは他のオブジェクトを所有しており、それぞれが他のオブジェクトを所有しているということを覚えておいてください。ですから、最初に探したいのは、漏れが最も少ないリークタイプです。リークタイプはツリーのルートになる可能性が高いためです。報告書は、あなたが1つのインスタンスをリークしていると言うならば

は例えば、それはそれらのTMyObjectインスタンスがリストに割り当てられ、あなただけのリストを解放するのを忘れている可能性があります。それを修正するとレポート全体がクリアになるので、他のものを除外するまで、個々の子オブジェクトについて狩りをしないでください。

+4

+1木に関する優れたヒント –

7

これを実行する最も良い方法は、どこにリークが発生した割り当てが行われたかをツールに伝えることです。これを行うには、FastMMのフルバージョンをダウンロードして使用する必要があります。 Delphiで提供されているバージョンにはその機能はありません。

完全なFastMMを使用すると、スタックトレースを含む必要な情報がすべて漏れていることを示すレポートが生成されます。