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

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

Как лучше очищать TList? [D5, Win2k]


Дельфятник ©   (2002-08-02 10:09:00) 

В TList я сначала запихиваю экземпляры класса MyClass, а затем надо освободить память, занимаемую этими экземплярами, и память, занимаемую TList"ом.
Я делаю так:
(здесь L - это переменная типа TList)
if L<>nil then
begin
if L.Count>0 then for i:=0 to L.Count-1 do if L.Items[i]<>nil then
begin
EarthPoint(L.Items[i]).Free;
L.Items[i]:=nil
end;
L.Free
end
Ещё можно делать L.Clear. Что лучше, или это одно и то же?


panov   (2002-08-02 13:26:00) [1]

Вдогонку:
Во всех вариантах вместо
TMyClass(L[i]).Free;
достаточно написать TObject(L[i]).Free;
В этом случае код будет более универсальным.


Anatoly Podgoretsky   (2002-08-02 13:02:00) [2]

Вариант А не ээфективный, по сравнению с вариантом В


Nikolai_S   (2002-08-02 12:54:00) [3]

Если использовать TList, то можно использовать два спсоба:
1. Если нужно уничтожить список:
for i := 0 to L.Count - 1 do
TmyClass(L[i]).Free;
L.Free;

2. Если список нужно лишь очистить от объектов, которые нужно высвободить их памяти:
a)
while L.Count > 0 do
begin
TMyClass(L[0]).Free;
L.Delete(0);
end;
b) либо
for i := 0 to L.Count - 1 do
TMyClass(L[i]).Free;
L.Clear;

в случае a) не нужно переменную i заводить


Дельфятник   (2002-08-02 11:09:00) [4]

Спасибо!


MBo   (2002-08-02 11:03:00) [5]

>TList лучше использовать TObjectList?
если в списке только объекты, то да, c OwnsObjects:=True не надо будет заботиться об очистке объектов


MBo   (2002-08-02 11:02:00) [6]

тем,что Free для объектов не сделается.
Delete убирает указатель из списка, но сам объект остается болтаться в памяти. Dispose применяется для ссылочных типов, память под которые выделялась вызовом New, но не для классов


Дельфятник   (2002-08-02 10:59:00) [7]

MBo> Кстати, TObjectList может освобождать свои объекты.

Вы хотите сказать, что вместо TList лучше использовать TObjectList?


Дельфятник   (2002-08-02 10:56:00) [8]

Спасибо всем.

В общем, как я понял
EarthPoint(L.Items[i]).Free;
очистит память из-под объектов.
А ещё есть такие варианты:
1) L.Delete(i);
2) Dispose(L.Items[i]);
Чем они лучше или хуже EarthPoint(L.Items[i]).Free ?


MBo   (2002-08-02 10:34:00) [9]

>TList.Clear вызывать не нужно
Верно, забыл, что в конце первого код есть L.Free


Zelius   (2002-08-02 10:30:00) [10]

TList.Clear вызывать не нужно!!! Вот как выглядит деструктор:

destructor TList.Destroy;
begin
Clear;
end;


MBo   (2002-08-02 10:29:00) [11]

>TList.Clear очистит список, но не удолит объекты из него
объекты как раз удалит, но не освободит их самих


Zelius   (2002-08-02 10:27:00) [12]

В принципе - все правильно!
но некоторые строки не обязательны, проще будет выглядеть так:

if L<>nil then
begin
for i:=0 to L.Count-1 do
EarthPoint(L.Items[i]).Free;
L.Free
end;

Дело в том, что метод Free сам проверяет указатель на nil, и не будет освобождать ниловый объект.
TList.Clear очистит список, но не удолит объекты из него, плюс он вызывает в деструкторе TList. Твоя задача - освободить объекты.


MBo   (2002-08-02 10:24:00) [13]

TList.Clear не очищает память из-под объектов (в широком смысле), указатели на которые он содержит.
В твоем коде ни к чему, наверно, делать,
L.Items[i]:=nil
а вот L.Clear в конце вызвать нужно.

Кстати, TObjectList может освобождать свои объекты.


Дельфятник   (2002-08-02 10:12:00) [14]

Ой, опечатка: MyClass(L.Items[i]).Free;


Наверх

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