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é :
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!