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