Неопределенное поведение при удалении канавки массива символов освобождает *

Это верный что следующие урожаи неопределенное поведение:

void * something = NULL;
char * buffer = new char[10];

something = buffer;
buffer = NULL;

delete [] something; // undefined??

Сделайте я сначала должен бросить something кому: char * ?

6
задан Sam 14 August 2014 в 11:20
поделиться

2 ответа

Да, строго, когда вы используете delete [] статический тип указателя, который вы удаляете [] должен соответствовать типу массива, который вы изначально выделили, иначе вы получите неопределенное поведение.

Обычно во многих реализациях delete [] вызывает void * , который на самом деле является массивом типа, который не имеет нетривиального деструктора, работает, но это не гарантируется .

delete[] buffer

или

delete[] (char*)something

будут действительными.

4
ответ дан 10 December 2019 в 02:45
поделиться

Да.

Из стандарта (5.3.5 Удалить):

Значение операнда удаления должно быть значением указателя, которое получено из предыдущего массива новый -expression.72) В противном случае поведение не определено. [Примечание: это означает, что синтаксис выражения удаления должен соответствовать типу объекта, выделенного функцией new, не синтаксису выражения new. {{ 1}}]

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

** Это означает, что объект нельзя удалить с помощью указателя типа void *, потому что нет объектов типа void.

5
ответ дан 10 December 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: