Форум: "Corba";
Текущий архив: 2010.03.07;
Скачать: [xml.tar.bz2];
ВнизУтечка памяти (объекты 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 вся ветка
Форум: "Corba";
Текущий архив: 2010.03.07;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.005 c