Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.08.19;
Скачать: [xml.tar.bz2];

Вниз

Ещё один вопрос по очистке TList a.   Найти похожие ветки 

 
Дельфятник   (2002-08-06 12:31) [0]

У меня есть процедура по очистке TList"a, набитого экземплярами класса TMyClass. У этого TMyClass есть наследник - TMyClassChild, экземпляры которого я также запихиваю в TList. Вопрос состоит в том, корректно ли будет очищаться память занятая TList"ом забитым экземплярами класса TMyClassChild если для очистки этого TList"a будет использоваться процедура очистки TList"a содержащего его родителя - TMyClass?


 
Виктор Щербаков   (2002-08-06 12:34) [1]

Приведи код процедуры очистки.
А вообще, не должно быть проблем.


 
Дельфятник   (2002-08-06 13:19) [2]

procedure ClearTList(L: TList);
var i: Cardinal;
begin
if L<>nil then
begin
if L.Count>0 then for i:=L.Count-1 downto 0 do
begin
TMyClass(L.Items[i]).Free;
L.Delete(i)
end;
L.Free
end
end;


 
still   (2002-08-06 13:21) [3]

Проблем не будет, если деструктор - виртуальный.


 
Дельфятник   (2002-08-06 13:25) [4]

Деструктор чего?


 
Виктор Щербаков   (2002-08-06 13:27) [5]

TMyClass и TMyClassChild.


 
Дельфятник   (2002-08-06 13:36) [6]

А что значит виртуальный?
В классах TMyClass и TMyClassChild метод Destroy я не переопределял. Только в классе TMyClassChild я написал событие Free поскольку одно из свойств TMyClassChild имеет тип TList.

procedure TMyClassChild.Free;
begin
ClearRangeList(altitudes);
inherited
end;

где процедура ClearRangeList отличается от вышеприведённой ClearTList только именем класса в который преобразуются элементы TList.


 
Polevi   (2002-08-06 13:40) [7]

2Дельфятник
см. still © (06.08.02 13:21)


 
Толик   (2002-08-06 13:46) [8]

Вот чего не надо делать НИКОГДА, так это писать свою ф-ю Free. Эта ф-я наследуется из TObject, но там она НЕ ВИРТУАЛЬНАЯ, т.е.

procedure TMyClassChild.Free;
begin
ClearRangeList(altitudes);
inherited
end;

смысла не имеет! Ну откуда возьмётся inherited, если указателя на эту ф-ю нет в VMT?

Вот решение:

for i := List.Count - 1 downto 0 do
TObject(List.Item[i]).Free();
//Free вызывает деструктор, а вот деструктор виртуальный!
List.Free();


 
Деструктор   (2002-08-06 13:48) [9]

Ты не можешь переписать метод Free - он не виртуальный
и так же не можешь вызвать в нём inherited по тем же причинам.
(Ты можешь создать (и создал) новый Free, но это ни к чему хорошему не приведёт).

Метод Free работает следующим образом:

procedure TObject.Free;
begin
if Self <> nil then Destroy; // Вызов виртуального деструктора
end;

Поэтому тебе нужно просто переписать деструктор:

TMyClassChild = class
...
destructor Destroy; override; // !!!!!!!
end;

destructor TMyClassChild.Destroy;
begin
ClearRangeList(altitudes);
inherited;
end;



 
Дельфятник   (2002-08-06 16:35) [10]

Всем спасибо.



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

Форум: "Основная";
Текущий архив: 2002.08.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.007 c
14-60853
jen_bond
2002-07-23 11:27
2002.08.19
Помогите с сылкой


14-60811
Дмитрий Баранов
2002-07-23 18:24
2002.08.19
Проектирование бухгалтерских БД


1-60619
Hellman
2002-08-06 08:08
2002.08.19
Текста в записях


1-60676
mmb
2002-08-05 11:18
2002.08.19
Threads: можно ли из одного потока запустить и остановить другой


4-60913
ga3
2002-06-15 01:12
2002.08.19
переменные окружения





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский