2010-03-23 5 views
6

Верно ли, что следующие выходы неопределенное поведение:Неопределенное поведение при удалении обугленного массива trought пустоту *

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

something = buffer; 
buffer = NULL; 

delete [] something; // undefined?? 

ли я в первую очередь необходимо, чтобы бросить something в char *?

ответ

4

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

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

delete[] buffer 

или

delete[] (char*)something 

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

5

Да.

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

Значение операнда удаления должно быть значение указателя, которое в результате предыдущего массива нового-expression.72) Если нет, поведение не определено. [Примечание: это означает, что синтаксис delete-expression должен соответствовать типу объекта, выделенного новым, , а не синтаксисом нового выражения. ]

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

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

+0

Это не только значение операнда, но и тип, см. Следующий параграф в 5.3.5 (3). –

+0

@Charles Bailey Исправлено. – sinek

 Смежные вопросы

  • Нет связанных вопросов^_^