Конференция "Corba" » Утечка памяти (объекты TConnectionPoints/TConnectionPoint ) [Delphi, Windows]
 
  • vlad-mal © (26.11.06 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 © (26.11.06 16:52) [1]
    Наверное, из- за того, что выходной день, не дождался ответа. :)

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

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


     TCustomApplication = class(TAutoObject,
    IConnectionPointContainer,      ICustomApplication)



    public- метод:

     public
       procedure BeforeDestruction; override;



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


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



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

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

    Всем спасибо.
 
Конференция "Corba" » Утечка памяти (объекты TConnectionPoints/TConnectionPoint ) [Delphi, Windows]
Есть новые Нет новых   [134431   +9][b:0][p:0.001]