FastMM4 によると、現在取り組んでいる Delphi プログラムは多くの文字列をリークしています。正確には AnsiStrings:
アプリケーション ( http://sourceforge.net/projects/orwelldevcpp/ ) は、他の多くのデータ型をリークしていましたが、FastMM4 はインスタンスが作成された場所を報告できたので、なんとか修正しました。奇妙なことに、FastMM4 はこれらのリークの場所をまったく報告しません。
編集:結局のところそうであるようです。修正の回答を参照してください。とにかく、問題はまだ残っています: どうして私はこれらのものを漏らしているのですか?
ええと、残念ながら、何を探すべきかわかりません。つまり、これらが範囲外になった場合、それらは自動的に正しく解放されるはずです (ヒープ上にある場合でも)。
ランダムにコメントして、カウントに何が起こるかを確認することで、いくつかのリークを追跡することができました. 次に例を示します。
// simply passing it a constant creates a leak...
MainForm.UpdateSplash('Creating extra dialogs...');
procedure TMainForm.UpdateSplash(const text : AnsiString);
begin
if not devData.NoSplashScreen then // even if this branch is NOT taken
SplashForm.Statusbar.SimpleText := 'blablabla' + text;
end;
// And even if the function call itself is placed within a NOT taken branch!
リークの別の例を次に示します。
// Passing this constants produces leaks...
procedure TCodeInsList.AddItemByValues(const a, b, c: AnsiString;...);
var
assembleditem : PCodeIns;
begin
new(assembleditem);
assembleditem^.Caption:=a;
assembleditem^.Line:=b;
assembleditem^.Desc:=c;
...
fList.Add(assembleditem);
end;
// ... even when calling this on WM_DESTROY!
destructor TCodeInsList.Destroy;
var
I: integer;
begin
for I := 0 to fList.Count - 1 do
Dispose(fList[I]);
fList.Free;
inherited Destroy;
end;
// produces leaks!?
ここにはかなりの数の文字列リークの質問がありますが、どのパターンを探すべきかを明確にするものはありません。Google も提供していません。
編集:だから、渡された定数を探す必要があります。しかし、なぜ?
ええと、何かアイデアはありますか?