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

Вниз

Как лучше очищать TList?   Найти похожие ветки 

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

В 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. Что лучше, или это одно и то же?


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

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


 
MBo ©   (2002-08-02 10:24) [2]

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

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


 
Zelius ©   (2002-08-02 10:27) [3]

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

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:29) [4]

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


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

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

destructor TList.Destroy;
begin
Clear;
end;



 
MBo ©   (2002-08-02 10:34) [6]

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


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

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

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


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

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

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


 
MBo ©   (2002-08-02 11:02) [9]

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


 
MBo ©   (2002-08-02 11:03) [10]

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


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

Спасибо!


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

Если использовать 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 заводить


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

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


 
panov ©   (2002-08-02 13:26) [14]

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



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

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

Наверх




Память: 0.49 MB
Время: 0.015 c
3-48005
cooluse
2002-07-27 23:11
2002.08.15
Помогите чайнику с БД разобраться!


1-48178
Sub
2002-08-02 15:54
2002.08.15
Копирование файлов.


4-48357
Geser
2002-06-10 09:20
2002.08.15
Skinable Apllication


14-48279
Igor_thief
2002-07-17 13:21
2002.08.15
Потоки


1-48064
НАИВый панк
2002-08-03 01:03
2002.08.15
как Дэлфи выделяет зарегистрированные слова (begin, end, function