Устранение утечек памяти - PullRequest
2 голосов
/ 04 декабря 2011

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

Итак, из источника проекта я положил ReportMemoryLeaksOnShutdown := True;

Теперь, когда мое приложение закрыто, оно обнаруживает много утечек памяти. Моя непосредственная мысль состоит в том, чтобы проверить, что созданные объекты освобождены правильно (попробуйте .. окончательно .. бесплатно и т. Д.)

Я перебрал код и не вижу, откуда могут возникнуть утечки, и теперь мне нужно их найти, потому что если об утечках памяти сообщается при выходе из приложения, это очень много значит, что утечки памяти происходят в время выполнения, которое будет расти в размерах и это плохо!

По ссылке выше были рекомендованы сторонние инструменты, такие как Eureka Log. Есть ли способ использовать только IDE и отладчик, чтобы помочь мне найти и исправить проблемные области?

UPDATE

Мне удалось избавиться от примерно 6 утечек памяти, я обнаружил, что это связано с MDI Childs. Дочерние элементы хранят некоторые данные указателя в списках, и когда основное приложение закрывается, оно не освобождает дочерние элементы правильно, что теперь исправлено.

Теперь у меня осталось 2 ошибки:

enter image description here

Я нашел этот пост http://fgaillard.com/2011/02/when-the-debugger-leaks/, который может указывать на то, что отладчик виноват в моей вышеуказанной ошибке?

Ответы [ 2 ]

19 голосов
/ 04 декабря 2011

Во-первых, убедитесь, что вы получаете полную версию FastMM . Он имеет некоторые дополнительные возможности, такие как FullDebugMode, которые помогут вам здесь. Перестройте ваш проект с настройками FullDebugMode и 'LogMemoryLeaksToFile', определенными в параметрах компилятора, и библиотекой FullDebugMode в той же папке, что и ваш EXE-файл. Это создаст файл с подробной информацией о вашей утечке памяти в программе shtudown, в дополнение к диалоговому окну. Наиболее полезной информацией здесь будет частичная трассировка стека каждого распределения.

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

Например, если в отчете говорится, что вы пропускаете один экземпляр TObjectList и 1000 TMyObject, вполне вероятно, что эти экземпляры TMyObject назначены списку, и вы просто забыли освободить список. Исправление, которое очистило бы весь отчет, поэтому не ищите отдельные дочерние объекты, пока не исключите другие вещи.

7 голосов
/ 04 декабря 2011

Лучший способ сделать это - заставить инструмент сообщить, где было выполнено распределение, которое привело к утечке.Для этого вам необходимо скачать и использовать полную версию FastMM.Версия, поставляемая с Delphi, не имеет такой возможности.

При использовании полного FastMM будет создан отчет со всеми необходимыми подробностями, включая следы стека, чтобы сообщить вам, какой фрагмент кода просочился.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...