Объект автоматизации утечки памяти (TConnectionPoints)

У меня есть объект автоматизации с поддержкой событий, который утечки памяти. FConnectionPoints, которые идут с сгенерированным источником, никогда не освобождаются. Когда я вручную добавляю FConnectionPoints.Free в деструктор, утечка исчезает.

Я на Delphi 7, используя FastMM BorlandMM.dll и FastMM_Fulldebugmode.dll.

Действия по воспроизведению:

  1. Начать новый проект библиотеки ActiveX
  2. Добавить новый объект автоматизации: Name = TestObject; Отметьте "Создать код поддержки события"
  3. Откройте TypeLibrary, добавьте метод в ITestObject, добавьте событие в ITestObjectEvents
  4. Обновить, код будет сгенерирован.
  5. Добавьте ShareMem в качестве первого модуля в вашем файле.dpr
  6. Сохраните, скомпилируйте и зарегистрируйте этот сервер ActiveX (меню "Пуск")
  7. Начать новый проект приложения
  8. Поместите ShareMem в качестве первого модуля в вашем файле.dpr
  9. Импортировать модуль библиотеки типов: создайте модуль из библиотеки DLL, которую вы только что создали на шаге 6, и установите флажок "Создать оболочку компонента"
  10. В вашем FormCreate добавьте следующий код:

код:

var
  lTest: TTestObject;
begin
  lTest := TTestObject.Create(nil);
  try
    lTest.ConnectKind := ckNewInstance;
    lTest.Connect;
    lTest.Disconnect;
  finally
    lTest.Free;
  end;
end;

Теперь скомпилируйте, запустите и закройте это приложение. Утечка памяти будет сообщено.

Вопрос:

Это ошибка в шаблоне кода Delphi, я что-то делаю неправильно или она предназначена для самостоятельного освобождения FConnectionPoints (помощь не упоминает об этом)?

2 ответа

Решение

Я обнаружил, что об этой проблеме сообщается в отчете Quality Central № 1480.

Сисоп попросил меня создать новый отчет, так что я сделал: отчет № 81288.

Это также отвечает на мой вопрос: это ошибка в шаблоне кода.

Я не до конца понимаю вопрос, так как никогда не работал с объектами автоматизации, но насколько я вижу IConnectionPoint это интерфейс. Интерфейсы в Delphi подсчитываются (если реализация наследуется от TInterfacedObject, TContainedObject или же TAgreggatedObject или реализует _AddRef а также _Release соответственно), поэтому не должно быть утечки памяти.

Для получения дополнительной информации об интерфейсах посмотрите эту статью.

Эта глава из Delphi Language Guide также может помочь.

Другие вопросы по тегам