Объект автоматизации утечки памяти (TConnectionPoints) - PullRequest
0 голосов
/ 08 января 2010

У меня есть объект автоматизации с поддержкой событий, который приводит к утечке памяти. 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 ]

1 голос
/ 08 января 2010

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

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

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

0 голосов
/ 20 января 2010

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

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

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

...