Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TList [D7]


vlad ©   (2013-02-05 13:32:00) 

Достаточно ли такого удаления из TList: List.Delete(i) если елементом списка является ссылка на структуру-запись память под которую выделялась через NEW или нужно так:

ARec =  List[i];
Dispose(ARec);
и только потом List.Delete(i);


Ega23   (2013-02-05 16:25:00) [1]

Вот почему я class предпочитаю record-у. За TObjectList  :)


Игорь Шевченко   (2013-02-05 14:23:00) [2]


> Т.е. на нее можно повесить код, и освобождать это дело не
> как


Если надо чистить один раз, то проще в цикле.
RTFS: Db.pas, TLookupList


O'ShinW   (2013-02-05 14:01:00) [3]


> Можно было в исходники и не смотреть, это и так ясно, как
> божий день.

Да. И так и писал, не заглядывая
 for i := FRuleList.Count - 1 downto 0 do
 begin
   LocPER := FRuleList.Items[i];
   Dispose(LocPER);
   FRuleList.Delete(i);
 end;

Но, теперь стало известно(мне, во всяком - теперь), что идет нотификация, чего я, например, не знал.
Т.е. на нее можно повесить код, и освобождать это дело не как

> закат Солнца вручную

а почти :) автоматически.


Anatoly Pogoretsky   (2013-02-05 13:57:00) [4]

> Amoeba_  (05.02.2013 13:48:03)  [3]

Достаточно было взглянуть
в справке
TPointerList = array[0..MaxListSize-1] of Pointer;


vlad   (2013-02-05 13:49:00) [5]


> Amoeba_   (05.02.13 13:43) [2]
>
> Dispose - обязателен! List.Delete только удаляет запись
> из списка, но не освобождает занимаемую ей память.
>
> Порядок может быть и
>
> ARec =  List[i];
> Dispose(ARec);
> List.Delete(i);
>
> и
>
> ARec =  List[i];
> List.Delete(i);
> Dispose(ARec);


Это и хотел узнать.


Ega23   (2013-02-05 13:49:00) [6]


> Достаточно ли такого удаления из TList: List.Delete(i) если
> елементом списка является ссылка на структуру-запись память
> под которую выделялась через NEW или нужно так:


Зависит от ситуации. Например, есть некий глобальный список чего-то-там. И есть список отфильтрованных записей. В случае глобального списка - надо освобождать. В случае ситуации с фильтром - не надо.


Amoeba_   (2013-02-05 13:48:00) [7]


> O'ShinW ©   (05.02.13 13:42) [1]
>
> судя по исходникам, список не освобождает сам

Можно было в исходники и не смотреть, это и так ясно, как божий день. Ведь TList может хранить все что угодно: записи, объекты, и простые типы. И откуда ему знать что там конкретно, и, соответственно вызовом чего освобождать оное (и нужно ли в конкретном случае).


Amoeba_   (2013-02-05 13:43:00) [8]

Dispose - обязателен! List.Delete только удаляет запись из списка, но не освобождает занимаемую ей память.

Порядок может быть и

ARec =  List[i];
Dispose(ARec);
List.Delete(i);

и

ARec =  List[i];
List.Delete(i);
Dispose(ARec);


O'ShinW   (2013-02-05 13:42:00) [9]

судя по исходникам, список не освобождает сам
а только шлет уведомление
procedure TList.Notify(Ptr: Pointer; Action: TListNotification);

думаю, правильнее делать закат Солнца вручную :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо