Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.009 c
1-48043
Poirot
2002-08-03 06:50
2002.08.15
Как сообщить компоненту из свойства-объекта - надо перерисов


14-48266
MAN-IN-RED
2002-07-19 13:24
2002.08.15
Где в Киеве можно купить Xbox?


3-47957
grandad
2002-07-26 10:31
2002.08.15
Нужно поставить прогу, работающую с БД accesss (mdb) от MS Office


6-48238
KPV-10k
2002-05-24 21:18
2002.08.15
Опять про TServerSocket и TClientSocket...


1-48116
Jusic
2002-08-01 00:57
2002.08.15
Как очистить содержимое Canvas а у TImage?




   Наверх