В C ++ определено ли поведение для удаления примитивного типа, такого как uint32_t, через char *?

Вы можете использовать стиль раздела UITableViewStyleGrouped tableview.

2
задан iBug 17 January 2019 в 03:22
поделиться

2 ответа

Из [expr.delete] / 3 в стандарте C ++ 17 (хотя это правило восходит к C ++ 11 и, возможно, к более раннему, но у меня нет этой спецификации под рукой) :

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

Динамический тип объекта, на который указывает объект, - uint32_t. Тип указателя - char. Это не одно и то же, и char не является базовым классом uint32_t, поэтому поведение не определено.

0
ответ дан Nicol Bolas 17 January 2019 в 03:22
поделиться

Определенно нет эквивалентности между delete int_ptr; и delete char_ptr;, основанными на сборке, скомпилированной из некоторого базового кода C ++: вычисляет другое количество байтов для хранения в регистре, чем сборка, которую delete делает char*.

Итак, на первый взгляд, ясно, что тип, который распознает компилятор, имеет значение. Даже если нет другой причины, кроме как гарантировать, что правильный объем памяти будет удален. Таким образом, вы не можете полагаться на то, что компилятор волшебным образом выведет правильное поведение для delete указателя, тип которого был изменен вызовом reinterpret_cast: вам нужно убедиться, что delete указатели являются типом, которым они были созданный как - или для полиморфных типов, убедитесь, что Deleter имеет значение virtual.

0
ответ дан Xirema 17 January 2019 в 03:22
поделиться
Другие вопросы по тегам:

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