Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Destroy для вложенных TList.TList 
:(
    Опции темы
RinOSpro
Дата 9.7.2009, 11:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Всем привет! Есть 2 класса наседованные от TList,
Код

TAList = class(TList)
end;

TBList = class(TList)
  FAList: TAList;
end;


Вопрос вот в чем, нужно ли в классе TBList, создавать деструктор который делает следующее:
Код

destructor TBList.Destroy;
var
  i: Integer;
begin
  for i := 0 to FAList.Count - 1 do
    FAList[i].Destroy;

  inherited Destroy;
end;

Или этого не обязательно делать, так как это делается автоматом?
  Вверх
RomanEEP
Дата 9.7.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 5
Всего: 8



правильно так:
1)никогда не вызывать Destroy(), а вызывать Free.
2)Каждый объект отвечает за уничтожение только "своих" объектов
Код

destructor TAList.Destroy;
var
  i: Integer;
begin
  for i := 0 to Count - 1 do
    TObject(Items[i]).Free;
  inherited;
end;

destructor TBList.Destroy;
var
  i: Integer;
begin
  FAList.Free;
  inherited;
end;



Добавлено через 3 минуты и 20 секунд
ЗЫ: если TAList = class(TObjectList), то деструктор TAList.Destroy будет не нужен
PM MAIL   Вверх
Alexeis
Дата 9.7.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  Для объектов удобно использовать TObjectList. Он умеет уничтожать объекты.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RinOSpro
Дата 9.7.2009, 16:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Alexeis @  9.7.2009,  13:13 Найти цитируемый пост)
  Для объектов удобно использовать TObjectList


Смотрел код TObjectList, вроде ни каких изменений, на счет Destroy-я объектов в нем нет. даже деструктор не переписан.
  Вверх
Alexeis
Дата 9.7.2009, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(RinOSpro @  9.7.2009,  15:51 Найти цитируемый пост)
Смотрел код TObjectList, вроде ни каких изменений, на счет Destroy-я объектов в нем нет. даже деструктор не переписан.


  Плохо смотрел.
Код

constructor Create(AOwnsObjects: Boolean); overload;

Если он создается с флагм true то по уничтожению убьет все объекты, если объекты это тоже TObjectList то для каждого из них вызовется виртуальный деструктор, который уничтожит все внутренние объекты.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
THandle
Дата 9.7.2009, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



RinOSpro, деструктор у TObjectList остался старый, от TList. Но реализован метод Notify, реализован следующим образом:

Код

procedure TObjectList.Notify(Ptr: Pointer; Action: TListNotification);
begin
  if OwnsObjects then
    if Action = lnDeleted then
      TObject(Ptr).Free;
  inherited Notify(Ptr, Action);
end;


То есть, если параметр переданный в конструкторе - true и действием является удаление элемента списка, то тогда объект освобождается.
В самой реализации TObjectList метод Notify с lnDeleted не вызывается, а вот в TList такой вызов Notify при удалении элемента предусмотрен.
То есть при "убийстве" экземпляра TObjectList'а происходит следующее(выше TList'а по иерархии не поднимаемся).

TList.Destroy -> TList.Clear -> TList.SetCount(0) -> тут для каждого элемента списка выполняется TList.Delete, а в нем происходит вызов Notify  с lnDeleted -> TObjectList.Notify. Вот тут то и происходит уничтожение объектов находящихся в списке.

Про TObjectList еще можно глянуть статейку:

http://base.vingrad.ru/view/3110-TObjectList
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0490 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.