L' delete[]
opérateur est utilisé pour supprimer des tableaux. L' delete
opérateur est utilisé pour supprimer des objets non-tableau. Il appelle operator delete[]
et operator delete
fonctionne respectivement pour supprimer la mémoire occupée par le tableau ou l'objet non-tableau après avoir (éventuellement) appelé les destructeurs pour les éléments du tableau ou l'objet non-tableau.
Ce qui suit montre les relations:
typedef int array_type[1];
// create and destroy a int[1]
array_type *a = new array_type;
delete [] a;
// create and destroy an int
int *b = new int;
delete b;
// create and destroy an int[1]
int *c = new int[1];
delete[] c;
// create and destroy an int[1][2]
int (*d)[2] = new int[1][2];
delete [] d;
Pour le new
qui crée un tableau (donc, soit le new type[]
soit new
appliqué à une construction de type tableau), le Standard recherche un operator new[]
dans la classe de type d'élément du tableau ou dans la portée globale et transmet la quantité de mémoire demandée. Il peut demander plus que N * sizeof(ElementType)
s'il le souhaite (par exemple pour stocker le nombre d'éléments, de sorte que plus tard, lors de la suppression, il sait combien d'appels de destructeur à done). Si la classe déclare un operator new[]
qui supplémentaire à la quantité de mémoire en accepte un autresize_t
, ce deuxième paramètre recevra le nombre d'éléments alloués - elle peut l'utiliser pour n'importe quel but (débogage, etc ...).
Pour le new
qui crée un objet non-tableau, il recherchera un operator new
dans la classe de l'élément ou dans la portée globale. Il passe la quantité de mémoire demandée (exactement sizeof(T)
toujours).
Pour le delete[]
, il examine le type de classe d'élément des tableaux et appelle leurs destructeurs. La operator delete[]
fonction utilisée est celle de la classe du type d'élément, ou s'il n'y en a pas alors dans la portée globale.
Pour le delete
, si le pointeur passé est une classe de base du type de l'objet réel, la classe de base doit avoir un destructeur virtuel (sinon, le comportement n'est pas défini). S'il ne s'agit pas d'une classe de base, alors le destructeur de cette classe est appelé et un operator delete
dans cette classe ou le global operator delete
est utilisé. Si une classe de base a été transmise, le destructeur du type d'objet réel est appelé et l' operator delete
élément trouvé dans cette classe est utilisé, ou s'il n'y en a pas, un global operator delete
est appelé. Si le operator delete
dans la classe a un deuxième paramètre de type size_t
, il recevra le nombre d'éléments à désallouer.