Поиск утечек памяти в Delphi-программах является неотъемлемой частью работы. Утечки памяти в программах могут происходить по ряду причин, одной из которых является не уничтожение всех объектов, созданных в ходе работы программы. По умолчанию, разработчик в Delphi не видит, что происходит после выхода из приложения, однако, в Delphi найти утечку памяти можно и, не прибегая к использованию сторонних инструментов.
| Основная информация по компоненту | ||
| Исходник официального примера и документация | DocWiki | |
Демонстрационный пример показывает как в Delphi находить утечки памяти, добавлять объекты в список исключений при детектировании утечек памяти, включать или отключать контроль утечек памяти в Delphi.
Внешний вид демонстрационного приложения представлен на рисунке ниже:
Использование ReportMemoryLeaksOnShutdown
Глобальная переменная ReportMemoryLeaksOnShutdown позволяет выводить при выходе из приложения сообщение с информацией об утечках памяти в вашем приложении Delphi.
Установите для ReportMemoryLeaksOnShutdown значение True, чтобы сообщить об утечках памяти при завершении работы.
Диспетчер памяти может сообщить о памяти, которая была выделена, но не освобождена к моменту завершения работы диспетчера памяти. Такие блоки памяти называются утечками памяти и наиболее часто являются результатом ошибок программирования.
Если для глобальной переменной ReportMemoryLeaksOnShutdown задано значение True, то диспетчер памяти будет сканировать пул памяти при завершении работы приложения Delphi и сообщать обо всех незарегистрированных утечках памяти в диалоговом окне.
Ожидаемые утечки памяти могут быть зарегистрированы, поэтому диспетчер памяти будет игнорировать их во время проверок на утечки памяти.
Используйте процедуры RegisterExpectedMemoryLeak и UnregisterExpectedMemoryLeak для управления областями памяти, которые диспетчер памяти проверяет на утечки.
Демонстрационный пример
Демонстрационный пример показывает работы с глобальной переменной 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.
При подготовке статьи использовалась информация со следующих ресурсов:
- Официальный репозиторий демонстрационных примеров Delphi на SourceForge
- Документация по переменной на сайте Embarcadero

