FastMM4を使用すると、リークされたポインタを簡単に登録できますが、リークされた文字列を登録することはできません。どうやら、@
文字列に適用された演算子は、実際には文字列全体を提供しているわけではなく、PChar(string)
;も提供していません。リークされた文字列を適切に登録するために何を使用できますか?
今のところ私はこの作品を見つけました:
FastMM4.RegisterExpectedMemoryLeak(Pointer(NativeInt(PChar(StringVariable))-12));
しかし、それは魔法の数に依存しており、それは12
バージョンに依存しており、コードは実際に何が起こっているのかを表現していません。文字列を受け取り、文字列の「ベース」へのポインタを返すRTL関数、またはFastMM4
私が見落としていたメソッドがどこかにあることを願っています。
私はその醜い表現の獣をこのような手順で詰めることができますが、それでもそれはハッキーだと思います:
procedure RegisterExpectedStringLeak(const s:string);
begin
{$IFDEF VER210}
FastMM4.RegisterExpectedMemoryLeak(Pointer(NativeInt(PChar(s))-12));
{$ELSE}
{$MESSAGE Fatal 'This only works on Delphi 2010'}
{$ENDIF}
end;
これは質問には関係ないはずです。これが私が文字列を漏らしている理由です:
アプリケーションの存続期間中、特定のデータを保存するためにキャッシュメカニズムを使用しています。これらのオブジェクトを解放するつもりはありません。アプリケーションの存続期間中はオブジェクトが必要であり、適切なファイナライズを実行するのは、アプリケーションのシャットダウン時の時間を無駄にするだけだからです。これらのオブジェクトにはいくつかの文字列フィールドが含まれているため、明らかにこれらの文字列は「リーク」されます。