Безопасно ли удалить объект POD указателем на его базу?

На самом деле я думаю о тривиально разрушаемых объектах, а не только о POD (я не уверен, что POD может иметь базовый класс).

Когда я прочитал это объяснение is_trivially_destructible из cppreference, я заметил это:

Хранение, занятое тривиально разрушаемыми объектами, может быть повторно использовано без вызова деструктора.

Таким образом, это безопасно:

struct A {
  int a;
};
struct B : A {
  int b;
};
int main() {
  A* a = new B;
  delete a;
}

B::~B() не будет вызван - и AFAIK (пожалуйста, исправьте, если я ошибаюсь) вся память будет освобождена. И B::~B() наверняка тривиально.

Я знаю, что этот код плохо пахнет, но мой вопрос касается только безопасности этого кода...

Ответ 1

Нет, это запрещено. [expr.delete]/p3, акцент мой:

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

Фактически, комитет довольно недавно отклонил предложение удалите POD с помощью указателя на базу, четко определенного.