"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que a exclusão de uma matriz de objetos derivados por meio de um ponteiro base é um comportamento indefinido em C++?

Por que a exclusão de uma matriz de objetos derivados por meio de um ponteiro base é um comportamento indefinido em C++?

Publicado em 23/12/2024
Navegar:974

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

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:

  • Arrays não suportam comportamento polimórfico para evitar penalizar usos legítimos.
  • A exclusão polimórfica de matrizes pode ser implementada separadamente, se necessário.
Tutorial mais recente Mais>

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