Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Разница между интерфейсами в Delphi 7 и Delphi 2007

Автор вопроса: ronaldosantanaОтветов: 1

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

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

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

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

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

  • Если FastMM не сообщает об утечке, значит, утечки нет. Или, если есть утечка, это память, выделенная другим распределителем, например в сторонней DLL. David Heffernan 17.03.2011
  • Теперь, когда вы упомянули, другое отличие состоит в том, что в Delphi 2007 мы используем dbxINT30.dll Это похоже на версию Delphi 7 (или версию DLL на Delphi 7), по какой-то причине знаете, как освободить память и т. Д., Но с версией Delphi 2007 он просто продолжает расти - когда близко, отчета об утечке нет, но что-то действительно не так ... ronaldosantana 17.03.2011
  • @david: FastMM будет сообщать только об утечках, которые остаются утечками в конце программы. Если во время выполнения происходит утечка памяти, которая каким-то образом очищается перед завершением программы, FastMM не считает это утечкой. Я удивлен, что кто-то с вашим опытом этого не знает. ;) Deltics 17.03.2011
  • @david, продолжение: Пример: форма, которая создает собственный компонент в ответ на какое-то событие, когда она должна сначала создать один такой компонент и повторно использовать его в последующих событиях. Когда форма закрывается, вытекшие компоненты очищаются, потому что они принадлежат форме. Что касается обнаружения утечек FastMM, это не утечка, но тем не менее это утечка в той форме, которая потенциально может привести к повреждению вашего приложения. Deltics 17.03.2011
  • Возможно, в новой DLL память выделяется напрямую в обход FastMM (см. stackoverflow.com/questions/4477936/) mjn 17.03.2011
  • @Deltics: Туше! Я знаю это, но никогда не рассматриваю это, потому что я лично никогда не использую свойство Owner для освобождения объектов, которые я создаю в коде. Естественно, я использовал его для потоковых компонентов, но я всегда пишу пары Create / Free в блоках Try / finally. Так что такого рода утечки просто не на моем радаре, но я согласен, что это может быть проблемой здесь. David Heffernan 17.03.2011

memory-leaksinterfacedelphidelphi-7delphi-2007

Ответы

Ответ 1 · рейтинг 3 · Rafael Colucci

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

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

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

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

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

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

Также обратите внимание на этот вопрос

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы