Delphi - строки структур не освобождаются [Менеджер FastMM] - PullRequest
4 голосов
/ 29 июля 2009

Если я заявляю

PSomeStruct = ^TSomeStruct;
TSomeStruct = record 
  s1 : string;
end;

и я запускаю следующий код:

var
  p: PSomeStruct;
begin
  new(p);
  p^.s1:= 'something bla bla bla';
  dispose(p);

диспетчер памяти FastMM 4 сообщает, что произошла утечка памяти (тип: строка, дамп данных: «что-то бла-бла-бла»). Однако, если я установлю строку s1 пустой до вызова dispose, все в порядке.

Второй способ, который я нашел, - это изменить тип записи на класс, тогда вместо new я создаю экземпляр, а вместо dispose я звоню instance.Free(). Работает без очистки строк вручную.

Есть ли способ заставить Delphi автоматически чистить мои строки, когда я звоню dispose?

Ответы [ 2 ]

1 голос
/ 30 июля 2009

Является ли FastMM первым устройством, используемым в вашем .dpr? В противном случае он может быть завершен слишком рано, сообщая о ложных утечках памяти.

И создает ли этот упрощенный пример кода ту же утечку памяти, что и при использовании JvSimpleXML? Когда это не так, вероятно, происходит больше, чем вы подозреваете.

По моему мнению: когда FastMM сообщает об утечке памяти, возникает утечка памяти.

1 голос
/ 30 июля 2009

Вы уже делаете правильные вещи. Если FastMM сообщает, что произошла утечка строки, то FastMM ошибочен или сообщает, что строка отличается от той, о которой вы думали. Процедура Dispose освобождает строки из записей.

В этом конкретном случае в любом случае для этой строки не должно быть выделено памяти. Это строковый литерал, поэтому я ожидаю, что компилятор назначит этот литерал; его счетчик ссылок должен быть -1, и FastMM никогда не должен был его видеть.

...