Quelle est la différence entre les opérateurs delete
et delete[]
en C ++?
c++
memory-management
delete-operator
Shreyasva
la source
la source
vector<>
place d'un tableau chaque fois que je le peux.std::unique_ptr<int>(new int[3])
, car il appellera regulardelete
sur le tableau qui est un comportement non défini. Au lieu de cela, vous devez utiliserstd::unique_ptr<int[]>
Réponses:
L'
delete
opérateur libère la mémoire et appelle le destructeur pour un seul objet créé avecnew
.L'
delete []
opérateur libère la mémoire et appelle des destructeurs pour un tableau d'objets créés avecnew []
.L'utilisation
delete
sur un pointeur renvoyé parnew []
oudelete []
sur un pointeur renvoyé parnew
entraîne un comportement non défini.la source
L'
delete[]
opérateur est utilisé pour supprimer des tableaux. L'delete
opérateur est utilisé pour supprimer des objets non-tableau. Il appelleoperator delete[]
etoperator 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:
Pour le
new
qui crée un tableau (donc, soit lenew type[]
soitnew
appliqué à une construction de type tableau), le Standard recherche unoperator 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 queN * 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 unoperator 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 unoperator new
dans la classe de l'élément ou dans la portée globale. Il passe la quantité de mémoire demandée (exactementsizeof(T)
toujours).Pour le
delete[]
, il examine le type de classe d'élément des tableaux et appelle leurs destructeurs. Laoperator 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 unoperator delete
dans cette classe ou le globaloperator 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 globaloperator delete
est appelé. Si leoperator delete
dans la classe a un deuxième paramètre de typesize_t
, il recevra le nombre d'éléments à désallouer.la source
C'est l'utilisation de base du modèle allocate / DE-allocate en c ++
malloc
/free
,new
/delete
,new[]
/delete[]
Nous devons les utiliser en conséquence. Mais je voudrais ajouter cette compréhension particulière de la différence entre
delete
etdelete[]
1)
delete
est utilisé pour désallouer la mémoire allouée à un seul objet2)
delete[]
est utilisé pour désallouer la mémoire allouée au tableau d'objetsquand nous disons
new ABC[100]
, le compilateur peut obtenir les informations sur le nombre d'objets à allouer (ici c'est 100) et appellera le constructeur pour chacun des objets créésmais en conséquence si nous utilisons simplement
delete ptr
pour ce cas, le compilateur ne saura pas combien d'objetsptr
pointent et finira par appeler le destructeur et supprimer la mémoire pour un seul objet (laissant l'invocation des destructeurs et la désallocation des 99 objets restants). Il y aura donc une fuite de mémoire.nous devons donc utiliser
delete [] ptr
dans ce cas.la source
free()
ceci et cela. Si vous utilisez un modèle de pseudo-destructeur, vous devez l'appeler une fois pour chaque objet utilisant unefor
boucle.Les opérateurs
delete
etdelete []
servent respectivement à détruire les objets créés avecnew
etnew[]
, en retournant à la mémoire allouée laissée disponible au gestionnaire de mémoire du compilateur.Les objets créés avec
new
doivent nécessairement être détruits avecdelete
et que les tableaux créés avecnew[]
doivent être supprimés avecdelete[]
.la source
Lorsque j'ai posé cette question, ma vraie question était: "Y a-t-il une différence entre les deux? Le moteur d'exécution ne doit-il pas conserver des informations sur la taille du tableau, et ne pourra-t-il donc pas dire de quoi nous parlons?" Cette question n'apparaît pas dans les "questions connexes", donc juste pour aider ceux comme moi, voici la réponse à cela: "pourquoi avons-nous même besoin de l'opérateur delete []?"
la source
delete
est utilisé pour un seul pointeur etdelete[]
est utilisé pour supprimer un tableau via un pointeur. Cela pourrait vous aider à mieux comprendre.la source
Eh bien .. peut-être que je pense que c'est juste pour explicite. L'opérateur
delete
et l'opérateurdelete[]
sont distingués mais l'delete
opérateur peut également libérer le tableau.Et déjà vérifié ce code n'a pas de fuite de mémoire.
la source