Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Утечка памяти (объекты TConnectionPoints/TConnectionPoint ) [Delphi, Windows]


vlad-mal ©   (2006-11-26 15:06:00) 

Всем привет. D7.1, FastMM4.

Настрол свой проект, чтобы он использовал FastMM4.
Вывалившийся список с описанием проблем типа "memory leak" просто убил, но достаточно  оперативно удалось все подчистить.
Однако, выяснилась след штука.
Вступление.
Приложение является COM - сервером и обращается к другим COM - серверам.
Стало быть, иногда нужно получить экземпляр "Себя"
(TCustomApplication.Create):

var
 gfMySelf          : ICustomApplication;
...
begin
 gfMySelf := TCustomApplication.Create;

, где

 TCustomApplication = class(TAutoObject, IConnectionPointContainer,
ICustomApplication)

...

и т.д.
Так вот, FastMM4 на каждый вызов TCustomApplication.Create ругается, что

---------------------------
bfCustom.exe: Обнаружена утечка памяти
---------------------------
В этом приложении происходят утечки памяти. Утечки блоков маленького размера
(исключая ожидаемые утечки зарегистрированные по указателю):

1 - 12 байт: TConnectionPoints x 1
13 - 20 байт: TList x 2, Unknown x 1
53 - 60 байт: TConnectionPoint x 1


Т.е. дело все в том, что не вызывается деструктор
TConnectionPoints/TConnectionPoint (модуль AxCtrls). Что и подтвердилось в отладчике.

Как объяснить/исправить?

Примечание:экземпляры TConnectionPoints/TConnectionPoint создаются в методе
TCustomApplication.Initialize, который создан визардом, ничего особенного:


procedure TCustomApplication.Initialize;
begin
inherited Initialize;
FConnectionPoints := TConnectionPoints.Create(Self);
if AutoFactory.EventTypeInfo <> nil then
FConnectionPoint := FConnectionPoints.CreateConnectionPoint(
AutoFactory.EventIID, ckSingle, EventConnect)
else FConnectionPoint := nil;
end;


Что скажите "по поводу"?


vlad-mal   (2006-11-26 16:52:00) [1]

Наверное, из- за того, что выходной день, не дождался ответа. :)

Короче, шаманил я с оладчиком - ну не вызывается деструктор, хоть убейся.
И судя по коду - не должен вызываться.

Уж не знаю, правильно ли, но сделал так:
Добавил к своему классу :


 TCustomApplication = class(TAutoObject,
IConnectionPointContainer,      ICustomApplication)


public- метод:

 public
   procedure BeforeDestruction; override;


в котором просто:


procedure TCustomApplication.BeforeDestruction;
begin
 FConnectionPoints.Free;
 inherited;
end;


Теперь никакой утечки памяти не фиксируется.

Только как-то все странно это - код конструктора создан визардом, а разрушать "внутренние" объекы кто должен?

Всем спасибо.


Наверх

Титульная страница Поиск, карта сайта Написать письмо