Требуется ли правильный тип оператора удаления в C ++? - PullRequest
7 голосов
/ 29 сентября 2011
void * intptr = new int;
delete (int *) intptr;

Требуется ли тип (int *)?

Ответы [ 4 ]

11 голосов
/ 29 сентября 2011

Да.

Тип должен соответствовать новому. Единственный случай, когда ему не нужно совпадать, это удаление производного типа через базовый указатель, где базовый тип имеет виртуальный деструктор.

4 голосов
/ 29 сентября 2011

Да. Поскольку C ++ не является языком «все для объекта», команда удаления должна знать тип того, что вы хотите удалить, чтобы знать, как его удалить.

1 голос
/ 30 сентября 2011
Будет вызвано

3 деструкторов для int.

Нет такой вещи, как "деструктор для int". delete / delete [] будет вызывать деструктор только для вещей, которые не относятся к типу POD или POD-класса.

0 голосов
/ 29 сентября 2011

Требуется, потому что delete будет вызывать деструктор для каждого выделенного элемента, даже для int.

Учтите это:

char * chars = new char[3];

delete [] (int*)chars;

Что будет? Будут названы 3 деструктора для int. Первый для адреса памяти &chars[0], второй для &chars[4] и третий для &chars[8]. Учтите, что &chars[4] и &chars[8] превышают размер выделенной памяти. Хотя деструктор int в большинстве, если не во всех компиляторах, является фиктивным, это неправильное поведение. А представь, если пишешь

delete [] (Foo*)chars;

, где Foo имеет деструктор и sizeof(Foo) > sizeof(char). Поведение вашей программы будет неопределенным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...