Разница между интерфейсами в Delphi 7 и Delphi 2007 - PullRequest
2 голосов
/ 17 марта 2011

У нас возникла проблема с утечкой памяти, которая происходит только во время работы приложения (при закрытии приложения нет отчета FastMM).

Мы изолируем проблему с помощью метода, который считывает значения из базы данных и создает экземпляры объектов из результата. (мы используем DBXPress для подключения к базе данных)

Класс, который выполняет работу с базой данных, реализует интерфейс. Используя тестовое приложение, которое не выполняет ничего, кроме запуска потока, считывающего значения из базы данных (всегда одинаковые значения), приложение в Delphi 7 не протекает. Но в Delphi 2007 память использовала скачки очень быстро. Это тот же код, то же тестовое приложение.

Когда вы проверяете приложение с помощью AQTime, вы видите, что число TStringList, TList и т. Д. (Все объекты, используемые классом базы данных) растут и уменьшаются, но проверяется память с помощью ProExplorer и диспетчера задач Windows, версии Delphi 2007 растет очень быстро.

Наше единственное предположение состоит в том, что Delphi 7 и Delphi 2007 имеют дело с выпуском интерфейса. Имеет ли это смысл? Кто-нибудь испытывал нечто подобное?

1 Ответ

3 голосов
/ 17 марта 2011

Ну ... Мои 2 цента:

В работе Delphi 2007 с интерфейсами нет ничего общего. Но давным-давно у меня была похожая проблема с интерфейсами, и в итоге я вообще не использовал счетчик ссылок на интерфейсы. Это не очень хорошо работает.

Вы не опубликовали свой источник, но я думаю, что ваши объекты, которые реализуют интерфейс, наследуются от TInterfacedOject, я прав? Если это так, подумайте о том, чтобы изменить его на свой собственный TInterfacedObject, который не будет реализовывать методы подсчета ссылок. Вам придется уничтожать свои объекты, вместо того чтобы иметь дело с Delphi.

Еще одна вещь, которую вы могли бы рассмотреть, это сказать delphi, что вам больше не нужен интерфейсный объект, установив nil для интерфейсного объекта, который вы не используете.

Но, как все говорили в комментариях, если fastmm не сообщает об утечке, у них вообще нет утечек. Тот факт, что память быстро растет, не указывает на утечку вашей программы. Это только говорит о том, что вы не обращаете внимания на свои объекты так, как хотели.

Вы должны использовать EurekaLog . Это очень хороший аддон, который сообщает об утечках памяти и их стеках вызовов.

Также взгляните на этот Вопрос

...