Безопасно ли удалить объект 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 с помощью указателя на базу, четко определенного.