удалите [] массив объектов

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

Objects *array = new Objects[N];

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

delete[] array;

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

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

Спасибо

ОБНОВЛЕНИЕ:

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

delete &array[i];

вынудить код скомпилировать.

31
задан Scooter 30 November 2014 в 18:30
поделиться

5 ответов

Каждое использование 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 , и тогда его деструктор позаботится об очистке за вас. Кроме того, это будет безопасным для исключений, поскольку не будет утечки памяти при возникновении исключений.

44
ответ дан 27 November 2019 в 21:40
поделиться
delete [] array

достаточно.

7
ответ дан 27 November 2019 в 21:40
поделиться

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

14
ответ дан 27 November 2019 в 21:40
поделиться

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

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

13
ответ дан 27 November 2019 в 21:40
поделиться

Мало того, что

delete [] array;

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

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

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

delete &array[i];

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

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

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

8
ответ дан 27 November 2019 в 21:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: