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:
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