Я нашел следующий фрагмент в стандарте 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
Я как-то неправильно понял формулировку в стандарте? Я что-то упустил? Почему стандарт определяет это как неопределенное поведение?