![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Освобождение памяти.
TStas © (2005-09-09 16:14:00)Когда я освобождаю память от объекта, но удаляю его, как его предка, например:
obj1:TWinControl;
(Sender as TControl).Free;
Точно вся память освободится?
Digitman (2005-09-09 16:59:00) [1]
> TStas © (09.09.05 16:37) [3]
если ты перекрыл в наследнике метод Destroy, за свой диструктор можешь не волноваться - он обязательно будет вызван, как бы ни был "обозван" Sender (лишь бы Sender имел тип, соответствующий одному из элементов цепочки "предков")
Anatoly Podgoretsky (2005-09-09 16:53:00) [2]Вот наглядный пример возможностей ООП
var
X : TStrings;
begin
X := TStringList.Create; // создаем из наследника
X.Free; // будет вызван метод Destroy класса TStringList, а не TStrings, поскольку метод виртуальной и заменяет собой метод TStrings.Destroy, вероятнее всего TStringList.Destroy вызовет внутри метод предка, но тебе об этом беспокоиться не стоит
end;
TStas (2005-09-09 16:37:00) [3]>Digitman
Наверно торможу. Что дистрой виртуальный метод, это понятно, как бы я ниначе его перекрыл. Но ведь Sender:TObject, то есть по адресу памяти, которым он является, найдется тип объекта и вызовется соответствующий деструктор?
Digitman (2005-09-09 16:18:00) [4]
> Точно вся память освободится?
а в чем сомнения-то ?
> удаляю его, как его предка
это ты явно сморозил.
причем здесь вообще предок ?
ты уничтожаешь ОБЪЕКТ !
и при этом неважно, наследником какого класса является уничтожаемый объект
Free вызовет Destroy.
Destroy - виртуальный метод.
MBo (2005-09-09 16:17:00) [5]деструктор Destroy - виртуальный метод так что вызовется деструктор именно нужного типа. К TControl приводить нет смысла.