Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.03.07;
Скачать: CL | DM;

Вниз

Утечка памяти (объекты TConnectionPoints/TConnectionPoint )   Найти похожие ветки 

 
vlad-mal ©   (2006-11-26 15:06) [0]

Всем привет. 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) [1]

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

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

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


 TCustomApplication = class(TAutoObject,
IConnectionPointContainer,      ICustomApplication)


public- метод:

 public
   procedure BeforeDestruction; override;


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


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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2010.03.07;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.012 c
2-1262610112
Sunktor
2010-01-04 16:01
2010.03.07
Нужно разделить главное окно на несколько функциональных частей


15-1261400337
@!!ex
2009-12-21 15:58
2010.03.07
Как заставить приложение работать с Кирелическим набором символов


15-1261258220
Юрий
2009-12-20 00:30
2010.03.07
С днем рождения ! 20 декабря 2009 воскресенье


2-1262806559
pavel_guzhanov
2010-01-06 22:35
2010.03.07
Странная работа ADOQuery


2-1262706738
Zalm
2010-01-05 18:52
2010.03.07
Работа с IStorage