Я нашел следующий сниппет в стандарте С++ 03 в разделе 5.3.5 [expr.delete] p3
:
В первом альтернативе (объект удаления), если статический тип объекта, который нужно удалить, отличается от его динамического типа, статический тип должен быть базовым классом динамического типа операндов, а статический тип должен иметь виртуальный деструктор или поведение undefined. Во втором альтернативе (удалить массив), если динамический тип подлежащего удалению объекта отличается от его статического типа, поведение undefined.
Быстрый просмотр статических и динамических типов:
struct B{ virtual ~B(){} };
struct D : B{};
B* p = new D();
Статический тип p
равен B*
, тогда как динамический тип *p
равен D
, 1.3.7 [defns.dynamic.type]
:
[Пример: если указатель
p
, статический тип которого является "указателем наclass B
", указывает на объектclass D
, полученный изB
, динамический тип выражения*p
D
. "]
Теперь, глядя на цитату вверху, это будет означать, что следующий код вызывает поведение undefined, если я получил это право, независимо от наличия деструктора virtual
:
struct B{ virtual ~B(){} };
struct D : B{};
B* p = new D[20];
delete [] p; // undefined behaviour here
Я неправильно понял формулировку в стандарте? Я что-то пропустил? Почему стандарт определяет это как поведение undefined?