![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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);
думаю, правильнее делать закат Солнца вручную :)