Re[3]: Уничтожение лок. переменных!!!???
От: MagIH Россия  
Дата: 05.10.03 13:48
Оценка:
Здравствуйте, WFrag, Вы писали:

WF>Гон. Вот тупое опровержение (все VC, до которых дотянулись руки — VC6.0, VC7.0, VC7.1):


WF>
WF>#include <iostream>

WF>struct A
WF>{
WF>    virtual ~A() { } // Типа не портим объект явно.
WF>    virtual void func() = 0;
WF>};

WF>struct B : public A
WF>{
WF>    virtual void func() { std::cout << "Yo!" << std::endl; }
WF>};

WF>int main()
WF>{
WF>    A& a = B();
WF>    a.~A(); // Деструктор типа нифига не делает, объекту все параллельно. ;)
WF>    a.func(); // Ооопс. А вот и нет!
WF>}
WF>


Прекрасный пример. Однако замечу, что неприятность возникла при использовании ВИРТУАЛЬНОЙ функции. И связана с тем, что для большинства платформ (не берусь утверждать что для всех) деструктор любого объекта, использующего виртуальные функции является не тривиальным (см. письмо от leper). Что этот пример и подтверждает прекрасно. Однако это уже особенности трансляторов (которые играются с таблицами виртуальных функций), а не требование стандарта.

MIH>>> Теперь об операторе delete. Он отличается тем, что делает два действия — вызывает деструктор и затем — освобождает память, выделнную под переменные объекта (впрочем оговорюсь, что delete может быть переопределён и делать что-то иное).


WF>Оператор delete переопределен не может быть. Может быть переопределена функция (ее еще иногда называеют операторной функцией) delete. Оператор delete делает всегда одну и ту же последовательность действий — вызов деструктора, вызов соответствующей операторной функции. Вроде так.


А вот это святая правда. Каюсь. Оператор delete действительно не может быть переопеределён и действительно последовательнось вызовов так же фиксирована. Тут я выразился весьма коряво...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.