私は、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つのエラーが残っています:
は、私は、デバッガを提案するかもしれないこの記事http://fgaillard.com/2011/02/when-the-debugger-leaks/が私の上記のエラーで故障しているましたか?
リコールリークはありませんが、アプリケーションが終了するまでに割り当てられた静的オブジェクトがまだメモリに残っていることがあります。 – AlexTheo
[how-to-get-a-stack-trace-from-fastmm](http://stackoverflow.com/questions/1130454/how-to-get-a-stack-trace-from-fastmm)を読んでください。 –
最初に注意しなければならないのは、TComponentベースのオブジェクト(コントロールを含む)が親コントロールを常にコンストラクタに渡すように作成されている場合、TComponentベースのオブジェクトについて心配する必要がないことです。 Delphiはこれらをあなたのためにリリースします。 TPersistentまたはTObject子孫がある場合は、これらを手動で解放する必要があります。リークレポートダイアログは、リークの原因となったクラス名を教えてください(SHOULD)。 – LaKraven