Объект автоматизации утечки памяти (TConnectionPoints)
У меня есть объект автоматизации с поддержкой событий, который утечки памяти. FConnectionPoints, которые идут с сгенерированным источником, никогда не освобождаются. Когда я вручную добавляю FConnectionPoints.Free в деструктор, утечка исчезает.
Я на Delphi 7, используя FastMM BorlandMM.dll и FastMM_Fulldebugmode.dll.
Действия по воспроизведению:
- Начать новый проект библиотеки ActiveX
- Добавить новый объект автоматизации: Name = TestObject; Отметьте "Создать код поддержки события"
- Откройте TypeLibrary, добавьте метод в ITestObject, добавьте событие в ITestObjectEvents
- Обновить, код будет сгенерирован.
- Добавьте ShareMem в качестве первого модуля в вашем файле.dpr
- Сохраните, скомпилируйте и зарегистрируйте этот сервер ActiveX (меню "Пуск")
- Начать новый проект приложения
- Поместите ShareMem в качестве первого модуля в вашем файле.dpr
- Импортировать модуль библиотеки типов: создайте модуль из библиотеки DLL, которую вы только что создали на шаге 6, и установите флажок "Создать оболочку компонента"
- В вашем 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 также может помочь.