Конференция "Corba" » Нужно ли освобождать объект? [Delphi, Windows]
 
  • Den303 © (29.08.07 10:00) [0]
    С помощью внутрипроцессорного COM-объекта создаю форму. Нужно ли явно вызывать Free при закрытии этой формы либо приложения?
  • Сергей М. © (29.08.07 10:05) [1]

    > С помощью .. COM-объекта создаю форму


    Что после этого происходит с COM-объектом ?
  • Den303 © (29.08.07 10:11) [2]
    Ничего больше. Из главной формы посылается запрос на создание модальной формы COM-объекту [Application.CreateForm(TForm,CreForm);]. Далее происходит некая работа пользователя с формой и её закрытие. Возможен вызов нескольких форм по очереди. Освобождать ресурсы надо ли? В каком месте? В OnClose формы? Или за этим следит сам COM?
  • Сергей М. © (29.08.07 10:20) [3]

    > Ничего больше


    Что, так и висит после этого "мертвым грузом" ?
  • Den303 © (29.08.07 10:20) [4]

    > Den303 ©   (29.08.07 10:11) [2]

    Сопс-на, сорри. Происходит различная обработка действий на созданной форме и передача результатов в приложение. После её закрытия форма не нужна, соотв и COM-объект не нужен. Он уничтожается сам? Ссылок вроде после закрытия формы нет. Или надо явно освободить?
  • Сергей М. © (29.08.07 10:27) [5]

    > Он уничтожается сам?


    Это у тебя надо спросить)

    COM-объект уничтожается после того как его внутренний сч-к ссылок становится равным нулю.


    > После её закрытия форма не нужна


    Тогда есть резон обработать OnClose с Action = caFree.
    Если у COM-объекта нет никаких "завязок" с созданной им формой, все должно пройти корректно.
  • Den303 © (29.08.07 10:31) [6]

    > COM-объект уничтожается после того как его внутренний сч-
    > к ссылок становится равным нулю.

    Как можно проверить этот счётчик?
  • Сергей М. © (29.08.07 10:40) [7]

    > Как можно проверить этот счётчик?


    Считай что никак, если объект не твоей разработки.
    Да и нет необходимости его проверять - нужно просто четко представлять себе, при каких твоих программных условиях и действиях происходит инкремент/декремент этого сч-ка.
  • Den303 © (29.08.07 10:51) [8]
    Объект моей разработки :o)
    Нужно во время разработки проследить за этим счётчиком. Как?
    _AddRef и _Release знаю, а как увидеть их результаты....
  • Den303 © (29.08.07 11:05) [9]
    Action:=caFree проходит успешно. Значит ли это, что память, занятая под COM-объектом, освобождена, при условии, что, кроме формы, объектов в COM нет?
  • Сергей М. © (29.08.07 11:07) [10]

    > Нужно во время разработки проследить за этим счётчиком.
    > Как?


    При использовании готового стандартного класса TComObject это довольно хлопотно.

    Проще запомнить условия модификации сч-ка.

    1. Инкремент происходит при:

    - создании объекта

    - копировании значения переменной, содержащей ссылку на существующий интерф.объект, в другую переменную (т.е. копировании интерфейса)

    2. Декремент происходит при:

    - явном присвоении переменной, содержащей ссылку на существующий интерф.объект, значения nil (если перем-я интерф.типа) или Null/Empty/Unassigned (если перем-я вариантного типа)

    - время жизни переменной закончилось.
  • Сергей М. © (29.08.07 11:08) [11]

    > Значит ли это, что память, занятая под COM-объектом, освобождена


    Нет, не значит.
  • umbra © (29.08.07 11:08) [12]
    если форма представлена переменной интерфейсного типа и в коде нигде явно не вызывается _AddRef и _Release (а если вызывается, то осознанно), то проблем быть не должно и явно освобождать ничего не надо. Основное правило примерно такое: если вы присваиваете ссылку на COM-объект переменной, то счетчик увеличивается. Если переменная уходит из области видимости или Вы явно присваиваете ей nil - счетчик уменьшается. Как только счетчик станет равным нулю, форма будет уничтожена (будет вызван ее деструктор).
  • Den303 © (29.08.07 11:09) [13]

    > Сергей М. ©   (29.08.07 11:07) [10]

    Огромное спасибо! Разобрался... пока что :o)
  • Den303 © (29.08.07 11:12) [14]

    > umbra ©   (29.08.07 11:08) [12]

    TNX и Вам!
    Раньше с COM'ом не работал, непривычно немного против VCL... Объекты сами освобождаются..... :o)
 
Конференция "Corba" » Нужно ли освобождать объект? [Delphi, Windows]
Есть новые Нет новых   [134431   +9][b:0][p:0.001]