Почему удаление массива производных объектов с помощью базового указателя может быть неопределенным
В C поведение удаления массива не определено, если динамический тип объекта отличается от его статического типа. Это описано в стандарте C 03 (5.3.5 [expr.delete] p3): «Во второй альтернативе (удаление массива), если динамический тип удаляемого объекта отличается от его статического типа, поведение не определено. ."
Для иллюстрации рассмотрим следующий фрагмент кода:
struct B { virtual ~B() {} };
struct D : B {};
B* p = new D[20];
delete[] p; // undefined behavior
Хотя удаление массива производных объектов с помощью базового указателя может показаться интуитивно понятным, стандарт определяет это как неопределенное поведение. Это связано с тем, что базовый указатель p указывает на базовый подобъект первого элемента массива, а не на сам первый элемент.
Реализация полиморфного удаления массивов потребует получения типа элемента, выполнения динамического приведения, а затем выполнить простое удаление[]. Однако это приведет к ненужным накладным расходам, даже если полиморфизм не используется.
Поэтому, чтобы избежать неопределенного поведения и ненужных накладных расходов, важно помнить, что массивы не могут вести себя полиморфно. Вместо этого, если желательно полиморфное поведение, его можно реализовать отдельно.
Вкратце:
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3