Почему это undefined поведение для удаления [] массива производных объектов с помощью базового указателя?

Я нашел следующий фрагмент в стандарте C ++ 03 в разделе 5.3.5 [expr.delete] p3 :

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


Краткий обзор статических и динамических типов:

struct B{ virtual ~B(){} };
struct D : B{};

B* p = new D();

Статический тип p - B * , а динамический тип * p - D ,

[ Пример : если указатель p , статическим типом которого является «указатель на класс B », указывает на объект класса D , производный от B , динамический тип выражения * p - « D .»]


Теперь посмотрим на цитату на вверху, это будет означать, что следующий код вызывает неопределенное поведение, если я правильно понял, независимо от наличия виртуального деструктора:

struct B{ virtual ~B(){} };
struct D : B{};

B* p = new D[20];
delete [] p; // undefined behaviour here

Я как-то неправильно понял формулировку в стандарте? Я что-то упустил? Почему стандарт определяет это как неопределенное поведение?

36
задан Brian Tompsett - 汤莱恩 31 July 2015 в 19:16
поделиться