Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-48172
FLIZ
2002-08-01 23:34
2002.08.15
как узнать сколько занимают в памяти поля объекта?


1-48039
BAY
2002-07-31 22:42
2002.08.15
Где RxGifAnimator?


14-48314
Kombat
2002-07-22 22:45
2002.08.15
Как передать проект заказчику с частичным кодом?


1-48149
MikeFW
2002-08-01 15:54
2002.08.15
Как сделать выполнение функции по нажатию кнопки Enter?


1-48051
V.Turecky
2002-08-04 08:40
2002.08.15
CreateProcess. Нужна информация.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский