Это верный что следующие урожаи неопределенное поведение:
void * something = NULL;
char * buffer = new char[10];
something = buffer;
buffer = NULL;
delete [] something; // undefined??
Сделайте я сначала должен бросить something
кому: char *
?
Да, строго, когда вы используете delete []
статический тип указателя, который вы удаляете []
должен соответствовать типу массива, который вы изначально выделили, иначе вы получите неопределенное поведение.
Обычно во многих реализациях delete []
вызывает void *
, который на самом деле является массивом типа, который не имеет нетривиального деструктора, работает, но это не гарантируется .
delete[] buffer
или
delete[] (char*)something
будут действительными.
Да.
Из стандарта (5.3.5 Удалить):
Значение операнда удаления должно быть значением указателя, которое получено из предыдущего массива новый -expression.72) В противном случае поведение не определено. [Примечание: это означает, что синтаксис выражения удаления должен соответствовать типу объекта, выделенного функцией new, не синтаксису выражения new. {{ 1}}]
В первой альтернативе (удалить объект ), если статический тип операнда отличается от его динамического типа , статический тип должен быть базовый класс динамического типа операнда и статический тип должны иметь виртуальный деструктор , иначе поведение не определено. Во второй альтернативе (удалить массив), если динамический тип удаляемого объекта отличается от его статического типа, поведение будет undefined *.
** Это означает, что объект нельзя удалить с помощью указателя типа void *, потому что нет объектов типа void.