Maison  >  Article  >  développement back-end  >  Pourquoi la suppression d'un tableau d'objets dérivés via un pointeur de base est-elle un comportement indéfini en C ?

Pourquoi la suppression d'un tableau d'objets dérivés via un pointeur de base est-elle un comportement indéfini en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-30 07:31:27700parcourir

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

Pourquoi la suppression d'un tableau d'objets dérivés via un pointeur de base peut être indéfinie

En C, le comportement de suppression d'un tableau est indéfini si le type dynamique de l'objet diffère de son type statique. Ceci est décrit dans la norme C 03 (5.3.5 [expr.delete] p3) : "Dans la deuxième alternative (supprimer un tableau), si le type dynamique de l'objet à supprimer diffère de son type statique, le comportement est indéfini ."

Pour illustrer, considérons l'extrait de code suivant :

<code class="cpp">struct B { virtual ~B() {} };
struct D : B {};

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

Bien qu'il puisse sembler intuitif de supprimer un tableau d'objets dérivés à l'aide d'un pointeur de base, la norme spécifie cela comme un comportement non défini . En effet, le pointeur de base p pointe vers le sous-objet de base du premier élément du tableau, plutôt que vers le premier élément lui-même.

La mise en œuvre de la suppression polymorphe des tableaux nécessiterait de récupérer le type d'élément, d'effectuer une conversion dynamique, puis en effectuant une simple suppression[]. Cependant, cela entraînerait une surcharge inutile même lorsque le polymorphisme n'est pas utilisé.

Par conséquent, pour éviter un comportement indéfini et une surcharge inutile, il est important de se rappeler que les tableaux ne peuvent pas se comporter de manière polymorphe. Au lieu de cela, si un comportement polymorphe est souhaité, il peut être implémenté séparément.

En résumé :

  • Les tableaux ne prennent pas en charge le comportement polymorphe pour éviter de pénaliser les utilisations légitimes.
  • La suppression polymorphe des tableaux peut être mise en œuvre séparément si nécessaire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn