web-dev-qa-db-fra.com

supprimer [] un tableau d'objets

J'ai alloué et tableau d'objets

Objects *array = new Objects[N];

Comment dois-je supprimer ce tableau? Juste

delete[] array;

ou avec itération sur les éléments du tableau?

for(int i=0;i<N;i++)
    delete array[i];
delete[];

Merci

MISE À JOUR:

J'ai changé de corps de boucle comme

delete &array[i];

pour forcer le code à compiler.

31
osgx

Chaque utilisation de new doit être équilibrée par un delete, et chaque utilisation de new[] doit être équilibré par delete[].

for(int i=0;i<N;i++)
    delete array[i];
delete[] array;

Ce ne serait approprié que si vous initialisiez le tableau comme suit:

Objects **array = new Objects*[N];
for (int i = 0; i < N; i++) { 
    array[i] = new Object;
}

Le fait que votre code d'origine vous ait donné erreur de compilation est un indice fort que vous faites quelque chose de mal.

BTW, obligatoire: évitez d'allouer des tableaux avec new[]; utilisation std::vector à la place, puis son destructeur se chargera du nettoyage pour vous. De plus, il sera protégé contre les exceptions en ne perdant pas de mémoire si des exceptions sont levées.

43
jamesdlin

Juste delete[] array est suffisant. Il est garanti que chaque élément du tableau est supprimé lorsque vous supprimez un tableau à l'aide de delete[] opérateur.

14
Naveen

En règle générale, vous devez delete/delete[] exactement ce que vous avez alloué avec new/new[]. Dans ce cas, vous avez une allocation avec new[], vous devez donc utiliser un seul appel à delete[] pour libérer à nouveau cette chose allouée.

Le fait que les delete dans la boucle for ne se compilent pas est également une bonne indication qu'ils ne sont pas la bonne façon de le faire.

13
sth

Non seulement

delete [] array;

assez, mais si vous le faites

for(int i=0;i<N;i++)
    delete &array[i];
delete[] array;

vous provoquerez un comportement indéfini, car

delete &array[i];

supprimera les éléments qui n'ont pas été retournés par une opération new.

Sans oublier que le delete[] array; appellera le destructeur pour tous les objets qui viennent d'avoir des destructeurs appelés dans la boucle.

Alors ne fais pas ça.

8
Michael Burr
delete [] array

est assez.

7
vava