2009-08-13 4 views
7

FAstMMは、IdStack.pasのTIdCriticalSectionからメモリリークを報告します。私はこれが意図的なリークであることを理解しています。これはコードに文書化されています。Delphi:IdStackのメモリリークですが、誰がIdStackを使用していますか?

IdStackが私のプロジェクトに含まれている理由はわかりません。どのようなユニットがそれを引っ張るのか、どのように調べることができますか?

delphi 2007に付属しているfastmmのバージョンを使用して、このリークをレポートから排除する方法はありますか?

更新: ビルドに含まれるすべてのpasファイルを見つける方法はありますか?

答えて

4

すべてのIndyユニットには「Id」という接頭辞が付いていますので、あなたのuses節にあるものがあるかどうか確認してください。

もう1つの方法は、TIdStack.create()にブレークポイントを配置することです。最終的に、有罪判決がコールスタックに表示されます。

+0

私はブレークポイントを試しましたが、決してブレークしません。私は初期化/終了セクションが実行される唯一のコードであるように見えます。 私は何かを見つけることができるかどうかを見るために、大規模なgrepをやっています。 – Vegar

+0

ワイドなgrepが使用されたユニットを見つけました! – Vegar

2

あなた.DPR 使用cnPack(cnPack.org)での使用方法を見て、選択の単位を削除するには「クリーナー使用」デルファイFastMMメモリマネージャが方法だから、

function RegisterExpectedMemoryLeak(P: Pointer): boolean; 

を提供

+0

これを行う別のオプションは、Pascal Analyzerの無料サブセットであるIcarusです。http://www.peganza.com/#ICARUS –

+0

wow。 cnPackについて聞いたことがありますが、それを試したことはありません。それは変更する必要があります! :-)ありがとう。 – Vegar

8

を参照していませんユニットを見つけてそれを削除できないことが判明した場合、このメソッドを使用してメモリリーク警告を抑制することができます。

4

これはネット上にたくさんありますが、散らばっています。それはあなたがIndy 9(D7付き)を使用しているかどうかによっても異なります。それも私を奪った。インディ9のために私はIdComponent.pasで、次のやった:

initialization 
    GStackCriticalSection := TCriticalSection.Create; 

    // BJF Starts 
    //RegisterExpectedMemoryLeak(GStackCriticalSection); 
    // BJF Ends 

finalization 
    // Dont Free. If shutdown is from another Init section, it can cause GPF when stack 
    // tries to access it. App will kill it off anyways, so just let it leak 

    // BJF has removed comments 
    FreeAndNil(GStackCriticalSection); 
end. 

しかし、あなたは、ライブラリパスにインディ・ソースへのパスを入れなければならないことに注意してください。私はインディ10がこの点で修正されていると信じています。 ブライアン

+0

これらのコメントは削除しないでください。マルチスレッドアプリケーションでは、そのために失敗する可能性があります。これはグローバル変数であり、Windowsは終了時にメモリとカーネルハンドル(クリティカルセクションなど)を両方とも解放します。このリンクとそれがリンクしている記事をご覧ください:http://blogs.msdn.com/b/oldnewthing/archive/2010/01/22/9951750.aspx –

関連する問題