Maison >développement back-end >C++ >Pourquoi la suppression d'un tableau dérivé via un pointeur de base est-elle un comportement non défini en C ?
Pourquoi un comportement non défini : suppression d'un tableau dérivé via un pointeur de base
La norme C 03 spécifie que la suppression d'un tableau d'objets dérivés via un pointeur de base est un comportement indéfini. Cela est dû à la différence entre le type statique et dynamique de l'objet à supprimer.
Type statique ou dynamique
Le type statique d'un pointeur est le type déclaré dans le code, tandis que le type dynamique est le type réel de l'objet pointé. Dans l'exemple de code :
<code class="cpp">struct B { virtual ~B() {} }; struct D : B {}; B* p = new D[20];</code>
Le type statique de p est B*, tandis que le type dynamique de *p est D.
Comportement non défini
La norme indique que dans la deuxième alternative (supprimer le tableau), si le type dynamique diffère du type statique, le comportement n'est pas défini. C'est parce que p ne pointe pas vers le début du tableau d'éléments D. Il pointe vers le sous-objet B du premier élément. Par conséquent, supprimez-le avec delete [] p; n'est pas valide.
Considérations relatives à l'implémentation
L'application de cette règle dans une implémentation nécessiterait que le compilateur détermine le type dynamique du tableau, puis convertit dynamiquement p en ce type avant de supprimer. Cependant, cela introduirait une surcharge inutile dans les cas où le polymorphisme n'est pas utilisé.
Tableaux polymorphes
Si vous avez besoin d'un tableau avec un comportement polymorphe, il est possible de créer votre propre implémentation en utilisant les installations existantes de C . Par exemple, vous pouvez créer un modèle de classe qui encapsule un tableau de pointeurs vers des objets dérivés :
<code class="cpp">template <typename T> class PolymorphicArray { public: PolymorphicArray(size_t size) : _size(size), _data(new T*[_size]) {} ~PolymorphicArray() { delete[] _data; } T*& operator[](size_t index) { return _data[index]; } private: size_t _size; T** _data; };</code>
Cette classe vous permet d'utiliser un comportement polymorphe sur un tableau d'objets dérivés sans enfreindre la norme.
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!