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 la suppression d'un tableau dérivé via un pointeur de base est-elle un comportement non défini en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-31 16:54:02551parcourir

Why is Deleting a Derived Array via a Base Pointer Undefined Behavior in 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!

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