У нас проблема с утечкой памяти, которая происходит только во время работы приложения (при закрытии приложения отчета FastMM нет).
Мы отделяем проблему от метода, который считывает значения из базы данных и создает экземпляры объектов из результата. (мы используем DBXPress для подключения к базе данных)
Класс, выполняющий работу с базой данных, реализует интерфейс. Используя тестовое приложение, которое ничего не делает, кроме запуска потока, считывающего значения из базы данных (всегда одни и те же значения), приложение в Delphi 7 не допускает утечек. Но в Delphi 2007 использованная память скачивается очень быстро. Это тот же код, то же тестовое приложение.
Когда вы проверяете приложение с помощью AQTime, вы можете видеть, что количество TStringList, TList и т. Д. (Всех объектов, используемых классом базы данных) растет и сжимается, но при проверке памяти с помощью ProExplorer и диспетчера задач Windows версия Delphi 2007 растет очень быстро. .
Мы можем только догадываться, что есть что-то другое в том, как Delphi 7 и Delphi 2007 занимаются выпуском интерфейса. Имеет ли это смысл? Кто-нибудь испытывал нечто подобное?
Ответ 1 · рейтинг 3 · Rafael Colucci
Ну ... Мои 2 цента:
В том, как delphi 2007 работает с интерфейсами, нет ничего необычного. Но давным-давно у меня была аналогичная проблема с интерфейсами, и я вообще не использовал счетчик ссылок на интерфейс. Это не очень хорошо работает.
Вы не разместили свой источник, но я предполагаю, что ваши объекты, реализующие интерфейс, наследуются от TInterfacedOject, я прав? Если это так, подумайте о том, чтобы изменить его на собственный TInterfacedObject, который не будет реализовывать методы подсчета ссылок. Вам придется уничтожать свои объекты вместо того, чтобы с ними разбираться delphi.
Еще одна вещь, которую вы можете подумать, - это сообщить delphi, что вам больше не нужен интерфейсный объект, установив nil для интерфейсного объекта, который вы не используете.
Но, как все говорили в комментариях, если fastmm не сообщает об утечке, то утечек нет вообще. Тот факт, что объем памяти быстро увеличивается, не означает, что ваша программа имеет утечку. Это лишь говорит о том, что вы не обращаете внимания на свои объекты, как хотели.
Вам следует использовать EurekaLog. Это очень хороший аддон, который сообщает об утечках памяти и их стеке вызовов.
Также обратите внимание на этот вопрос