7

プロジェクトをDelphi2007からDelphi2009にアップグレードした後、不明なメモリリークが発生しました。これまで、fastMMを使用してプロジェクトを追跡しようとしてきましたが、fastMMスタックトレースのレポートは次のとおりです。

A memory block has been leaked. The size is: 20

This block was allocated by thread 0x111C, and the stack trace (return addresses) 
  at the time was:
40339E [System.pas][System][@GetMem][3412] 534873 [crtl][_malloc]
56D1C4 [canex.cpp][MidasLib][DllGetDataSnapClassObject][3918]
56D316 [canex.cpp][MidasLib][DllGetDataSnapClassObject][3961]
56D5EE [canex.cpp][MidasLib][DllGetDataSnapClassObject][4085]
562D48 [DBCommon.pas][DBCommon][TFilterExpr.PutExprNode][1583]
408E46 [System.pas][System][DynArraySetLength][20464]
56D5EE [canex.cpp][MidasLib][DllGetDataSnapClassObject][4085]
408E92 [System.pas][System][@DynArraySetLength][20486]
528C1B [Forms.pas][Forms][TCustomForm.DoCreate][3260]
171A1A [GetRawStackTrace]

The block is currently used for an object of class: Unknown

The allocation number is: 302844

そして時々私はこれを得る:

A memory block has been leaked. The size is: 20

This block was allocated by thread 0x111C, and the stack trace (return addresses) 
  at the time was:
40339E [System.pas][System][@GetMem][3412]
534873 [crtl][_malloc]
56D1C4 [canex.cpp][MidasLib][DllGetDataSnapClassObject][3918]
56D316 [canex.cpp][MidasLib][DllGetDataSnapClassObject][3961]
77DC921A [RtlAnsiStringToUnicodeString]
56D5EE [canex.cpp][MidasLib][DllGetDataSnapClassObject][4085]
7726B8F5 [GetProcAddress]
7726B907 [GetProcAddress]
589B1E [ossrv.cpp][MidasLib][DllGetDataSnapClassObject][3163]
56D5EE [canex.cpp][MidasLib][DllGetDataSnapClassObject][4085]
408E92 [System.pas][System][@DynArraySetLength][20486]

The block is currently used for an object of class: Unknown

何が実際にメモリリークを引き起こしているのかを理解するためのより良い方法はありますか?

4

6 に答える 6

9

このメモリ リークは、Delphi のバグ、QC #67709が原因でした。

これは、前回の Delphi 2009 アップデートで修正されました。修正できなかったのも不思議ではありません。

于 2009-06-03T12:01:42.153 に答える
7

リークされたメモリ ブロックのサイズが、プログラムの使用時間が長くなるほど大きくならない限り、問題にはなりません。アプリケーションを終了したときにのみ解放される長命のオブジェクトがある場合、それらをリークした場合と同じです-すべてのメモリは終了時に回収されます(もちろん、メモリを超えたハンドルリソースを持っている場合を除きます)。

注意が必要なメモリ リークは、時間の経過や使用によって蓄積されるものです。毎回 20 バイトの場合は、気にしないでください。

于 2008-11-07T18:01:49.383 に答える
1

前回、これらの線に沿って不可解なリークが発生したとき、問題のあるオブジェクトの生のメモリを調べました。そして、それがどのような種類のデータであるかを示すテキストを見ました。オブジェクトの種類がわからないと表示された場合は、そもそもオブジェクトではない可能性が高いため、文字列など、動的に割り当てられたものを確認してください。

于 2009-06-02T03:53:58.593 に答える
1

D2009 VCL にリークがあるかどうかはわかりません。そのため、コードにリークがあると仮定して、まず次のことを確認します。

  • @DynArraySetLengthフォームを破棄するときに解放されない、そのフォームで作成された配列またはリスト (のため) はありますか。
  • 外部の呼び出し元によって解放されるべきオブジェクトを作成して返す関数はありますか?そのような関数がある場合は、呼び出し元がそのオブジェクトを解放するかどうかを確認してください。
  • これでリークが明らかにならない場合は、フォーム コードで作成した各オブジェクトが、フォームを破棄するときに破棄されるかどうかを確認する必要があります。
于 2008-11-07T15:12:13.050 に答える
0

DynArray を成長させている Form OnCreate イベント ハンドラで何かが起こっていると思います。
そして、その DynArray は最後に解放されません。
しかし、コードを見て実際に FastMM でデバッグしないと、実際に何が起こっているのかを推測することはほぼ不可能です。

于 2008-11-07T19:08:34.117 に答える
0

IIRC VCL には、このような非常に小さなリークがいくつかありましたが、あまり心配することなく無視できます。これもその一つかも!? 誰かがこの点を明確にしてくれることを願っています。

于 2008-11-07T12:54:24.030 に答える