сбой виртуального деструктора с использованием массива - PullRequest
5 голосов
/ 13 октября 2011

Я нашел этот код на веб-сайте

#include <iostream>

using namespace std;

struct Base
{
    Base() { cout << "Base" << " "; }
    virtual ~Base() { cout << "~Base" << endl; }

    int i;
};
struct Der : public Base
{
    Der() { cout << "Der" << endl; }
    virtual ~Der() { cout << "~Der" << " "; }

    int it[10]; // sizeof(Base) != sizeof(Der)
};

int main()
{
    Base *bp = new Der;
    Base *bq = new Der[5];

    delete    bp;
    delete [] bq;   // this causes runtime error
}

, почему он падает ?

1 Ответ

9 голосов
/ 13 октября 2011
Base *bq = new Der[5];
delete [] bq;   // this causes runtime error

Причина в том, что массивы не обрабатываются полиморфно .Поэтому в приведенном выше коде оператор delete вызывает неопределенное поведение .

§5.3.5 / 3 C ++ 03 говорит

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

Вам повезло, что это дает ошибку времени выполнения, и вы получили возможность узнать о серьезной ошибке в вашем коде как можно скорее.

...