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.
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.
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.
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.
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.
delete [] array
est assez.