Maison  >  Article  >  développement back-end  >  Pourquoi la suppression d'un tableau d'objets dérivés avec un pointeur de base est-elle considérée comme un comportement non défini en C ?

Pourquoi la suppression d'un tableau d'objets dérivés avec un pointeur de base est-elle considérée comme un comportement non défini en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-01 03:42:02307parcourir

Why is deleting an array of derived objects with a base pointer considered Undefined Behavior in C  ?

Pourquoi la suppression[] d'un tableau d'objets dérivés avec un pointeur de base est-elle un comportement non défini ?

Le standard C 5.3.5 [ expr.delete] indique que dans le cas d'un « tableau de suppression », un comportement non défini se produit si le type dynamique de l'objet à supprimer diffère de son type statique. Cela signifie que l'extrait de code suivant appelle un comportement non défini :

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

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

Raison d'être d'un comportement non défini

Une opération "supprimer []" nécessite un pointeur vers le premier élément d'un tableau. Cependant, lors de l'utilisation d'un pointeur de base vers un tableau d'objets dérivés, le pointeur fait en réalité référence au sous-objet de base du premier élément. Par conséquent, l'opération "delete []" tenterait de supprimer le sous-objet de base au lieu du premier élément du tableau, ce qui est incorrect.

Appliquer un comportement correct dans ce cas impliquerait de récupérer le type d'élément du tableau et effectuer un Dynamic_cast sur ce type. Cependant, cela introduirait une surcharge inutile pour chaque tableau polymorphe, même lorsque le polymorphisme n'est pas utilisé.

De plus, le pointeur "p" lui-même est d'une utilité limitée puisqu'il pointe uniquement vers un sous-objet de base. Les opérations courantes sur les tableaux telles que "p[i]" (pour i > 0) ne seraient pas possibles.

Conclusion

Le comportement non défini pour "supprimer [] " avec un pointeur de base vers un tableau d'objets dérivés est une décision de conception consciente qui :

  • Maintient l'efficacité pour les utilisations légitimes des tableaux
  • Permet la mise en œuvre de tableaux polymorphes si vous le souhaitez
  • Empêche les opérations de tableau incorrectes avec des pointeurs dérivés

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