Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.19;
Скачать: CL | DM;

Вниз

Ещё один вопрос по очистке 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
1-60635
Invega
2002-08-08 19:38
2002.08.19
Как в MainMenu сделать...


1-60658
Вечно молодой
2002-08-08 21:13
2002.08.19
TListView


14-60838
arbiter
2002-07-25 00:51
2002.08.19
хостииииииииинг


4-60921
Starkom
2002-06-07 12:36
2002.08.19
Как отследить существует ли дочерний процесс в системе?


3-60539
Aleksandr
2002-07-29 19:27
2002.08.19
ААА! Помогите с перекодировкой!