2

D2010 でコード化された単純なコードから始めましょう。

var
  StringList: TStringList;
begin
  ReportMemoryLeaksOnShutdown := True;
  StringList := TStringList.Create;
  StringList.LoadFromFile('c:\fateh.txt');
  RegisterExpectedMemoryLeak(StringList);

FastMM4 はAddr(StringList)as パラメータを使用してもメモリ リークを何度も報告するため、予想される MemoryLeak を登録する方法と、上記のメソッドが機能しない理由について事前に感謝します。

4

1 に答える 1

3

文字列リスト オブジェクトのリークのみを登録しました。また、文字列リストが所有するすべてのオブジェクトをリークしていることを登録する必要があります。この場合、オブジェクトStringList.Countのインスタンスを所有していますstring。メモリ マネージャーは、これらの文字列が文字列リスト オブジェクトによって所有されていることを認識しないため、リークも発生します。

そして、それは言うは易く行うは難しです。文字列を表すメモリ ブロックの先頭を見つける必要があるためです。これは文字列の最初の文字からの固定オフセットであり、オフセットは使用する Delphi のバージョンによって異なります。

Unicode Delphi では、32 ビット コードで、オフセットは 12 バイトです。したがって、次のようにすると、漏洩した文字列が登録されます。

for i := 0 to StringList.Count-1 do 
  if StringList[i]<>'' then
    RegisterExpectedMemoryLeak(PByte(StringList[i])-12);

これを行っても、2 つのメモリ リークが報告されます。それらの少なくとも 1 つは、文字列リストが所有する動的配列によって説明されますTStringList.FList。そのリークを登録したい場合は、さらにハッキングを行う必要があります。これは、その配列が格納されている場所に関する実装の詳細に依存する必要があるためです。

于 2013-03-23T10:46:24.147 に答える