Утечка AnsiStrings в приложении Delphi

Согласно FastMM4, программа Delphi, над которой я сейчас работаю, пропускает много строк . AnsiStrings, если быть точным:

enter image description here

Приложение (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 тоже не предоставляет.

Редактировать: поэтому мне нужно искать переданные константы. Но почему?

Итак, хм, есть идеи?

11
задан Orwell 27 May 2012 в 19:27
поделиться