Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.10.27;
Скачать: CL | DM;

Вниз

TList   Найти похожие ветки 

 
vlad   (2013-02-05 13:32) [0]

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

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


 
O'ShinW ©   (2013-02-05 13:42) [1]

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

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


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

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

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

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

и

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


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


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

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


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


> 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) [5]


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


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


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

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

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


 
O'ShinW ©   (2013-02-05 14:01) [7]


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

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

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

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

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


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


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


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


 
Ega23 ©   (2013-02-05 16:25) [9]

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



Страницы: 1 вся ветка

Текущий архив: 2013.10.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
2-1359840337
ttt
2013-02-03 01:25
2013.10.27
Смещение текста в Edit


2-1360056754
vlad
2013-02-05 13:32
2013.10.27
TList


15-1368477002
Юрий
2013-05-14 00:30
2013.10.27
С днем рождения ! 14 мая 2013 вторник


15-1368216598
Bitt
2013-05-11 00:09
2013.10.27
Передать управление при изменении byte


2-1359534426
Andrey869
2013-01-30 12:27
2013.10.27
перехват ошибок