Форум: "Основная";
Текущий архив: 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