![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ещё один вопрос по очистке TList a. [D5, Win2k]
Дельфятник © (2002-08-06 12:31:00)У меня есть процедура по очистке TList"a, набитого экземплярами класса TMyClass. У этого TMyClass есть наследник - TMyClassChild, экземпляры которого я также запихиваю в TList. Вопрос состоит в том, корректно ли будет очищаться память занятая TList"ом забитым экземплярами класса TMyClassChild если для очистки этого TList"a будет использоваться процедура очистки TList"a содержащего его родителя - TMyClass?
Дельфятник (2002-08-06 16:35:00) [1]Всем спасибо.
Деструктор (2002-08-06 13:48:00) [2]Ты не можешь переписать метод 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 13:46:00) [3]Вот чего не надо делать НИКОГДА, так это писать свою ф-ю 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();
Polevi (2002-08-06 13:40:00) [4]2Дельфятник
см. still © (06.08.02 13:21)
Дельфятник (2002-08-06 13:36:00) [5]А что значит виртуальный?
В классах TMyClass и TMyClassChild метод Destroy я не переопределял. Только в классе TMyClassChild я написал событие Free поскольку одно из свойств TMyClassChild имеет тип TList.
procedure TMyClassChild.Free;
begin
ClearRangeList(altitudes);
inherited
end;
где процедура ClearRangeList отличается от вышеприведённой ClearTList только именем класса в который преобразуются элементы TList.
Виктор Щербаков (2002-08-06 13:27:00) [6]TMyClass и TMyClassChild.
Дельфятник (2002-08-06 13:25:00) [7]Деструктор чего?
still (2002-08-06 13:21:00) [8]Проблем не будет, если деструктор - виртуальный.
Дельфятник (2002-08-06 13:19:00) [9]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;
Виктор Щербаков (2002-08-06 12:34:00) [10]Приведи код процедуры очистки.
А вообще, не должно быть проблем.