"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué eliminar una matriz de objetos derivados a través de un puntero base tiene un comportamiento indefinido en C++?

¿Por qué eliminar una matriz de objetos derivados a través de un puntero base tiene un comportamiento indefinido en C++?

Publicado el 2024-12-23
Navegar:990

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

Por qué la eliminación de una matriz de objetos derivados mediante un puntero base puede no estar definida

En C, el comportamiento de eliminar una matriz no está definido si el tipo dinámico del objeto difiere de su tipo estático. Esto se describe en el Estándar C 03 (5.3.5 [expr.delete] p3): "En la segunda alternativa (eliminar matriz), si el tipo dinámico del objeto a eliminar difiere de su tipo estático, el comportamiento es indefinido. ."

Para ilustrar, considere el siguiente fragmento de código:

struct B { virtual ~B() {} };
struct D : B {};

B* p = new D[20];
delete[] p; // undefined behavior

Si bien puede parecer intuitivo eliminar una matriz de objetos derivados usando un puntero base, el Estándar lo especifica como comportamiento indefinido. Esto se debe a que el puntero base p apunta al subobjeto base del primer elemento de la matriz, en lugar del primer elemento en sí.

Implementar la eliminación polimórfica de matrices requeriría recuperar el tipo de elemento, realizar una conversión dinámica, y luego realizar una eliminación simple []. Sin embargo, esto generaría una sobrecarga innecesaria incluso cuando no se utiliza el polimorfismo.

Por lo tanto, para evitar un comportamiento indefinido y una sobrecarga innecesaria, es importante recordar que las matrices no pueden comportarse polimórficamente. En cambio, si se desea un comportamiento polimórfico, se puede implementar por separado.

En resumen:

  • Las matrices no admiten el comportamiento polimórfico para evitar penalizar los usos legítimos.
  • La eliminación polimórfica de matrices se puede implementar por separado si es necesario.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3