Apr 20

Утечки памяти в Delphi

memoryleak

Сегодняшняя запись, в основном, для тех, кто недавно начал программировать в Delphi, т.к. "старики", в большинтве своем, знают о подобном инструменте.

Речь идет об уведомлениях об утечке памяти, при закрытии программы, появившейся в Delphi 2006 / Turbo Delphi. Это действительно очень полезная особенность, позволяющая обнаружить неожиданные, для программиста, утечки при выполнении.

Для того, чтобы разрешить Delphi выводить предупреждение, необходимо в файле проекта установить значение глобальной переменной в True:

ReportMemoryLeaksOnShutdown := DebugHook <> 0;

DebugHook необходим для того, чтобы сообщение, об утечках памяти, выводилось только тогда, когда приложение запускается из IDE.

После этого, при закрытии программы, если будут выявлены утечки памяти, будет показано окно, как на приведенном скриншоте. Да, информации выводится не много, но, в принципе, вполне достаточно, чтобы иметь представление, где именно происходит утечка памяти.

Для примера, добавьте в файл проекта приведенный выше код и в любом месте проекта сделайте примерно следующее:

var
sl : TStringList;
begin
sl := TStringList.Create;
sl.Add('Тут будет утечка памяти, т.к. объект sl не уничтожается.') ;
end;


  1. Александр
     Add karma Subtract karma  +1
    Цитировать.

    ReportMemoryLeaksOnShutdown: = DebugHook 0; Между : и = пробел лишний :)

    1
  2. MageSlayer
     Add karma Subtract karma  --1
    Цитировать.

    К сожалению таким сообщениям об утечке далеко до информативности.
    Раз уж речь зашла о проверке на утечки, то MemCheck по-прежнему рулит ;)

    https://code.launchpad.net/memcheck
    здесь мною патченная версия для Delphi 2006 (Turbo). Баг-репорты и т.д. приветствуются ;)

    2
  3. GN
     Add karma Subtract karma  --1
    Цитировать.

    Спасибо, интересная информация.

    3
  4. aktuba
     Add karma Subtract karma  --1
    Цитировать.
    Комментарий автора

    У меня что-то с MemCheck не сложилось… Проще с EurekaLog, но платная =(

    4
  5. aktuba
     Add karma Subtract karma  --1
    Цитировать.
    Комментарий автора

    Александр, упс… Поправил.

    5
  6. Корвин
     Add karma Subtract karma  --1
    Цитировать.

    Приведенная информация далека от полноты.
    Есть фриварный менеджер памяти для Делфи FastMM (http://fastmm.sourceforge.net)
    Он был впервые интегрирован в 2005 Делфи.
    И этот отчет об утечках памяти – его отчет.
    Его кстати можно использовать с Делфи начиная с 4 ки.
    Вот так.
    А еще есть режим FullDebugMode который стоит посмотреть…

    6
  7. aktuba
     Add karma Subtract karma  --1
    Цитировать.
    Комментарий автора

    Я всегда думал, что FastMM немного из другой “оперы”…

    7
  8. Корвин
     Add karma Subtract karma  --1
    Цитировать.

    Для примера идем сюда
    http://dn.codegear.com/article/33853
    И читаем в разделе про менеджер памяти
    “Based on FastMM, the new memory manager optimizes memory utilization while provide significantly better performance.”
    Что и требовалось доказать.
    А вообще надо не только в исходниках и хелпе копаться, но и читать доки с офсайта.
    Там бывает много полезного.

    8
  9. Андрей Сорвин
     Add karma Subtract karma  --1
    Цитировать.

    Хм.. Я не знал об этой глобальной переменной.

    Теперь буду знать.

    Спасибо!

    9

Поделитесь вашими мыслями

Поддерживаемые теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>