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

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему удаление[] массива производных объектов с помощью базового указателя является неопределенным поведением?

Сообщение Anonymous »

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


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




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

Код: Выделить всё

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

B* p = new D();
Статический тип p — B*, а динамический тип *p — D, 1.3 .7 [defns.dynamic.type]:


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




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

Код: Выделить всё

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

B* p = new D[20];
delete [] p; // undefined behaviour here
Может быть, я как-то неправильно понял формулировку стандарта? Я что-то упустил из виду? Почему стандарт определяет это как неопределенное поведение?

Подробнее здесь: https://stackoverflow.com/questions/617 ... via-a-base
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»