2016-09-22 2 views
1

В следующем примере, b является полиморфным типом указателя которого статического типа Base* и чей динамического типа Derived*.Что происходит при удалении полиморфного объекта без виртуального деструктора?

struct Base 
{ 
    virtual void f(); 
}; 

struct Derived : Base 
{ 

}; 

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

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

+0

прочитайте это также https://www.securecoding.cert.org/confluence/display/cplusplus/OOP52-CPP.+Do+not+delete+a+polymorphic+object+without+a+virtual+destructor – v78

+0

Возможный дубликат [Виртуальный деструктор отсутствует для базового класса в полиморфизме = утечка Ressource?] (Http://stackoverflow.com/questions/33455750/virtual-destructor-missing-for-base-class-in-polymorphism-ressource-leak) – stefaanv

ответ

2

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

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

5.3.5 Delete [expr.delete]

(курсив мой)

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

+2

@downvoter Пожалуйста, скажите мне, где я ошибаюсь, поэтому я могу улучшить его. – songyuanyao

0

По сути, это зависит от целевого компилятора и в общем случае

delete b; 

является вызов функции descructor для типа Ь и затем свободно выделенной памяти. Итак, если деструктор виртуальный, то вызываемая функция из виртуальной таблицы (~ Derived), но если это не называется функцией из класса (~ Base). Ожидаемый результат: будет вызываться только базовая.

Смежные вопросы