Por que excluir uma matriz de objetos derivados por meio de um ponteiro base pode ser indefinido
Em C , o comportamento de exclusão de uma matriz é indefinido se o tipo dinâmico do objeto difere de seu tipo estático. Isso está descrito na Norma C 03 (5.3.5 [expr.delete] p3): "Na segunda alternativa (delete array), se o tipo dinâmico do objeto a ser excluído for diferente de seu tipo estático, o comportamento é indefinido ."
Para ilustrar, considere o seguinte trecho de código:
struct B { virtual ~B() {} };
struct D : B {};
B* p = new D[20];
delete[] p; // undefined behavior
Embora possa parecer intuitivo excluir um array de objetos derivados usando um ponteiro base, o Padrão especifica isso como comportamento indefinido. Isso ocorre porque o ponteiro base p aponta para o subobjeto base do primeiro elemento na matriz, em vez do primeiro elemento em si.
A implementação da exclusão polimórfica de matrizes exigiria a recuperação do tipo de elemento, a execução de uma conversão dinâmica, e então executar uma exclusão simples[]. No entanto, isso incorreria em sobrecarga desnecessária, mesmo quando o polimorfismo não fosse utilizado.
Portanto, para evitar comportamento indefinido e sobrecarga desnecessária, é importante lembrar que os arrays não podem se comportar polimorficamente. Em vez disso, se o comportamento polimórfico for desejado, ele poderá ser implementado separadamente.
Em resumo:
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3