El delete[]
L'opérateur est utilisé pour supprimer les tableaux. Le site delete
L'opérateur est utilisé pour supprimer les objets qui ne sont pas des tableaux. Il appelle operator delete[]
y operator delete
respectivement pour supprimer la mémoire que le tableau ou l'objet non-réseau occupait après avoir (éventuellement) appelé les destructeurs des éléments du tableau ou de l'objet non-réseau.
Le tableau suivant 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[]
o new
appliqué à une construction de type tableau), la norme recherche un operator new[]
dans la classe de type d'élément du tableau ou dans la portée globale, et passe la quantité de mémoire demandée. Il peut demander plus de N * sizeof(ElementType)
s'il le souhaite (par exemple pour stocker le nombre d'éléments, afin de savoir plus tard, lors de la suppression, combien d'appels au destructeur ont été effectués). Si la classe déclare un operator new[]
qui s'ajoute à la quantité de mémoire accepte un autre size_t
ce second paramètre recevra le nombre d'éléments alloués - il pourra l'utiliser à toutes fins utiles (débogage, etc...).
Pour le new
qui crée un objet qui n'est pas un tableau, il cherchera un objet operator new
dans la classe de l'élément ou dans la portée globale. Il transmet la quantité de mémoire demandée (exactement sizeof(T)
toujours).
Pour le delete[]
il examine le type de classe des éléments des tableaux et appelle leurs destructeurs. Le site operator delete[]
utilisée est celle de la classe du type d'élément, ou s'il n'y en a pas, celle de la portée globale.
Pour le delete
si le pointeur transmis est une classe de base du type de l'objet réel, la classe de base doit avoir un destructeur virtuel (sinon, le comportement est indéfini). S'il ne s'agit pas d'une classe de base, alors le destructeur de cette classe est appelé, et un message d'erreur operator delete
dans cette classe ou le global operator delete
est utilisé. Si une classe de base a été transmise, alors le destructeur du type d'objet actuel est appelé, et la fonction operator delete
trouvée dans cette classe est utilisée, ou s'il n'y en a pas, un fichier 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.
0 votes
Vous pourriez trouver cette question pertinente stackoverflow.com/questions/1913343/
7 votes
Les problèmes avec delete et delete[] sont une des raisons pour lesquelles j'aime les pointeurs intelligents, et l'utilisation de
vector<>
au lieu d'un tableau chaque fois que je le peux.1 votes
stackoverflow.com/questions/1553382/
2 votes
@DavidThornley Si vous utilisez des pointeurs intelligents, vous devez tout de même connaître la différence dans le sens où vous devez savoir qu'il ne faut pas écrire par ex.
std::unique_ptr<int>(new int[3])
parce qu'il appellera régulièrementdelete
sur le tableau, ce qui est un comportement non défini. A la place, vous devez utiliserstd::unique_ptr<int[]>