«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему удаление массива производных объектов с помощью неопределенного поведения базового указателя в C++?

Почему удаление массива производных объектов с помощью неопределенного поведения базового указателя в C++?

Опубликовано 23 декабря 2024 г.
Просматривать:257

Why is Deleting an Array of Derived Objects via a Base Pointer Undefined Behavior in C  ?

Почему удаление массива производных объектов с помощью базового указателя может быть неопределенным

В 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