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