Согласно 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 также не предоставляет.
Изменить: так, я должен искать прошедшие константы. Но почему?
Итак, какие-нибудь идеи?