Форум: "Основная";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];
ВнизКак лучше очищать 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c