Что происходит при удалении полиморфного объекта без виртуального деструктора?

В следующем примере b – это тип полиморфного указателя, статический тип которого — Base*, а динамический тип — Derived*.

struct Base 
{
  virtual void f();
};

struct Derived : Base 
{ 

};

int main()
{
   Base *b = new Derived();
   // ...
   delete b;
}

Что происходит, когда b удаляется без виртуального деструктора?


person msc    schedule 22.09.2016    source источник
comment
прочитайте это также securecoding.cert.org/confluence/display/cplusplus/   -  person v78    schedule 22.09.2016


Ответы (1)


Что происходит, когда b удаляется без виртуального деструктора?

Мы не знаем. Поведение не определено. В большинстве реальных случаев деструктор Derived может не вызываться, но ничего не гарантируется.

5.3.5 Удалить [expr.delete]

(выделено мной)

В первом варианте (удаление объекта), если статический тип удаляемого объекта отличается от его динамического типа, статический тип должен быть базовым классом динамического типа удаляемого объекта, а статический тип type должен иметь виртуальный деструктор, иначе поведение не определено.

person songyuanyao    schedule 22.09.2016
comment
@downvoter Пожалуйста, скажите мне, где я ошибаюсь, чтобы я мог это исправить. - person songyuanyao; 22.09.2016