"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi la suppression d'un tableau d'objets dérivés via un pointeur de base est-elle un comportement non défini en C++ ?

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

Publié le 2024-12-23
Parcourir:426

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 n'est pas dé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 :

struct B { virtual ~B() {} };
struct D : B {};

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

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 implémentée séparément si nécessaire.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3