уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Поиск утечек памяти в Delphi-программах является неотъемлемой частью работы. Утечки памяти в программах могут происходить по ряду причин, одной из которых является не уничтожение всех объектов, созданных в ходе работы программы. По умолчанию, разработчик в Delphi не видит, что происходит после выхода из приложения, однако, в Delphi найти утечку памяти можно и, не прибегая к использованию сторонних инструментов.

Основная информация по компоненту
Исходник официального примера и документация SourceForge DocWiki

Демонстрационный пример показывает как в Delphi находить утечки памяти, добавлять объекты в список исключений при детектировании утечек памяти, включать или отключать контроль утечек памяти в Delphi.

Внешний вид демонстрационного приложения представлен на рисунке ниже:

 

Использование ReportMemoryLeaksOnShutdown

Глобальная переменная ReportMemoryLeaksOnShutdown позволяет выводить при выходе из приложения сообщение с информацией об утечках памяти в вашем приложении Delphi.

ReportMemoryLeaksOnShutdown работает только в приложениях Delphi и не действует в приложениях C ++ и в пакетах.

Установите для ReportMemoryLeaksOnShutdown значение True, чтобы сообщить об утечках памяти при завершении работы.

Диспетчер памяти может сообщить о памяти, которая была выделена, но не освобождена к моменту завершения работы диспетчера памяти. Такие блоки памяти называются утечками памяти и наиболее часто являются результатом ошибок программирования.

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

Значением по умолчанию для ReportMemoryLeaksOnShutdown является False.

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

Используйте процедуры RegisterExpectedMemoryLeak и UnregisterExpectedMemoryLeak для управления областями памяти, которые диспетчер памяти проверяет на утечки.

 

Диспетчер памяти поддерживает только платформу Windows. Создание ReportMemoryLeaksOnShutdown=True не влияет на другие платформы, которые используют менеджер памяти Posix/32.

Демонстрационный пример

Демонстрационный пример показывает работы с глобальной переменной ReportMemoryLeaksOnShutdown и методами  RegisterExpectedMemoryLeak и UnregisterExpectedMemoryLeak.

Первая кнопка на форме создает, но не освобождает объект (создает явную утечку памяти в приложении Delphi):

procedure TfLeakTestForm.bLeakClick(Sender: TObject);
begin
  TObject.Create;
end;

При этом, в событии OnCreate формы приложения переменной ReportMemoryLeaksOnShutdown присваивается значение True (включается контроль утечек памяти):

procedure TfLeakTestForm.FormCreate(Sender: TObject);
begin
  ReportMemoryLeaksOnShutdown := True;
end;

Теперь, если попытаться выйти из приложения, то получим вот такое информационное сообщение об утечке памяти в нашем Delphi-приложении:

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

Вторая кнопка в примере создает утечку памяти, но добавляет её в исключение:

procedure TfLeakTestForm.bLeakAndRegisterClick(Sender: TObject);
var
  LObject: TObject;
begin
  LObject := TObject.Create;
  RegisterExpectedMemoryLeak(LObject);
end;

Таким образом, если нажать кнопку и выйти из приложения, то никакого сообщения не будет — утечка памяти добавлена в исключение.
Клик по третьей кнопке создает утечку памяти, регистрирует её, затем освобождает созданный объект и и добавляет утечку в исключение. Т.к. код в обработчике не содержит в итоге никаких утечек, то сообщения об утечке памяти в Delphi не последует:

procedure TfLeakTestForm.bTestUnregisterClick(Sender: TObject);
var
  LObject: TObject;
begin
  LObject := TObject.Create;
  RegisterExpectedMemoryLeak(LObject);
  LObject.Free;
  UnregisterExpectedMemoryLeak(LObject);
end;

И, наконец, воспользовавшись списком выбора на форме приложения можно включить или отключить мониторинг утечек памяти в Delphi:

procedure TfLeakTestForm.cbLeakReportingEnabledChange(Sender: TObject);
begin
  ReportMemoryLeaksOnShutdown := cbLeakReportingEnabled.ItemIndex = 1;
end;

Учитывая, что использование глобальной переменной ReportMemoryLeaksOnShutdown дает достаточно скромную информацию об утечках памяти в Delphi, не лишним будет также и упомянуть в этой статье об инструменте madexcept, который позволяет в числе прочего получать удобные и информативные отчёты об утечках памяти в Delphi.

При подготовке статьи использовалась информация со следующих ресурсов:

  1. Официальный репозиторий демонстрационных примеров Delphi на SourceForge
  2. Документация по переменной на сайте Embarcadero

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.