Я отлаживал странную проблему, когда объекты VMT внезапно указывали на методы базового объекта.
class Base
{
virtual void foo() {}
}
class Derived: public Base
{
void foo() {}
}
Derived * d = new Derived;
... much complex fettling ...
d->foo(); // Help! called Base::foo()!!!
Оказалось, что ошибка в «сложном» коде эффективно приводила к delete d;
. Я не буду вдаваться в подробности, кроме как скажу, что boost::noncopyable
- ваш друг, и никогда ни при каких обстоятельствах не катайте свои собственные классы умных указателей.
Но, мой вопрос заключается в следующем: является ли такое изменение VMT хорошим «запахом», который вы имеете дело с удаленным объектом? Я предполагаю, что VMT "развернут" обратно к Base
во время уничтожения?
Очевидно, это ужасно зависит от имплментации, и мне повезло, что память не была растоптана ...