Я нашел следующий сниппет в стандарте С++ 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, динамический тип выражения*pD. "]
Теперь, глядя на цитату вверху, это будет означать, что следующий код вызывает поведение undefined, если я получил это право, независимо от наличия деструктора virtual:
struct B{ virtual ~B(){} };
struct D : B{};
B* p = new D[20];
delete [] p; // undefined behaviour here
Я неправильно понял формулировку в стандарте? Я что-то пропустил? Почему стандарт определяет это как поведение undefined?