удалить [] массив объектов - PullRequest
30 голосов
/ 21 марта 2010

Я выделил и массив объектов

Objects *array = new Objects[N];

Как мне удалить этот массив? Просто

delete[] array;

или с итерацией по элементам массива?

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

Спасибо

UPDATE:

Я изменил тело цикла как

delete &array[i];

для принудительной компиляции кода.

Ответы [ 5 ]

42 голосов
/ 21 марта 2010

Каждое использование new должно быть сбалансировано delete, а каждое использование new[] должно быть сбалансировано delete[].

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

Это будет уместно, только если вы инициализировалимассив как:

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

Тот факт, что ваш исходный код дал вам ошибку компиляции , является сильным намеком на то, что вы делаете что-то не так.

Кстати,обязательно: избегайте выделения массивов с new[];вместо этого используйте std::vector, и тогда его деструктор позаботится о вашей очистке.Кроме того, он будет безопасен для исключительных ситуаций, поскольку не вызывает утечки памяти при возникновении исключений.

14 голосов
/ 21 марта 2010

Достаточно delete[] array. Гарантируется, что каждый элемент массива удаляется при удалении массива с помощью оператора delete[].

13 голосов
/ 21 марта 2010

Как правило, вы должны delete / delete[] именно те вещи, которые вы выделили с помощью new / new[]. В этом случае у вас есть одно выделение с new[], поэтому вы должны использовать один вызов delete[], чтобы снова освободить это выделенное.

То, что delete в цикле for не будут компилироваться, также является хорошим признаком того, что они не являются правильным способом сделать это.

8 голосов
/ 21 марта 2010

Не только

delete [] array;

достаточно, но если вы сделаете

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

, вы будете вызывать неопределенное поведение, потому что

delete &array[i];

будетудаление вещей, которые не были возвращены операцией new.

Не говоря уже о том, что последующий delete[] array; вызовет деструктор для всех объектов, которые только что имели деструкторы, вызванные в цикле.

Так что не делай этого.

7 голосов
/ 21 марта 2010
delete [] array

достаточно.

...