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