Я выделил и массив Объектов
Objects *array = new Objects[N];
Как я должен удалить этот массив? Просто
delete[] array;
или с итерацией по элементам массива?
for(int i=0;i<N;i++)
delete array[i];
delete[];
Спасибо
ОБНОВЛЕНИЕ:
Я изменил тело цикла как
delete &array[i];
вынудить код скомпилировать.
Каждое использование 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
, и тогда его деструктор позаботится об очистке за вас. Кроме того, это будет безопасным для исключений, поскольку не будет утечки памяти при возникновении исключений.
Достаточно просто delete [] array
. Гарантируется, что каждый элемент массива будет удален при удалении массива с помощью оператора delete []
.
Как правило, вы должны удалить
/ delete []
именно те вещи, которые вы разместили с помощью ] новый
/ новый []
. В этом случае у вас есть одно выделение с помощью new []
, поэтому вы должны использовать один вызов delete []
, чтобы снова освободить этот выделенный объект.
То, что delete
в цикле for не компилируется, также является хорошим признаком того, что это неправильный способ сделать это.
Мало того, что
delete [] array;
достаточно, но если вы сделаете
for(int i=0;i<N;i++)
delete &array[i];
delete[] array;
, вы вызовете неопределенное поведение, потому что
delete &array[i];
будет удалять вещи, которые не были возвращены новая
операция.
Не говоря уже о том, что последующий массив delete [];
вызовет деструктор для всех объектов, у которых только что были вызваны деструкторы в цикле.
Так что не делай этого.