Delete [] массив объектов
Я выделил и массив объектов
Objects *array = new Objects[N];
Как удалить этот массив?
Просто
delete[] array;
или с итерацией по элементам массива?
for(int i=0;i<N;i++)
delete array[i];
delete[];
Спасибо
UPDATE:
Я изменил тело цикла как
delete &array[i];
чтобы заставить компилировать код.
Ответы
Ответ 1
Каждое использование 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;
}
Тот факт, что ваш исходный код дал вам ошибку компиляции, - это сильный намек на то, что вы делаете что-то неправильно.
BTW, обязательно: избегайте выделения массивов с помощью new[]
; вместо этого используйте std::vector
, а затем его деструктор позаботится об очистке для вас. Кроме того, он будет безопасным для исключений, не утечка памяти, если выбрасываются исключения.
Ответ 2
Как правило, вы должны delete
/delete[]
точно те вещи, которые вы выделили с помощью new
/new[]
. В этом случае у вас есть одно выделение с new[]
, поэтому вы должны использовать один вызов delete[]
, чтобы освободить выделенную вещь снова.
То, что delete
в for-loop не будет компилироваться, также является хорошим показателем того, что они не подходят для этого.
Ответ 3
Просто delete[] array
достаточно. Гарантируется, что каждый элемент массива удаляется при удалении массива с помощью оператора delete[]
.
Ответ 4
Не только
delete [] array;
достаточно, но если вы делаете
for(int i=0;i<N;i++)
delete &array[i];
delete[] array;
вы будете вызывать поведение undefined, потому что
delete &array[i];
будет удалять вещи, которые не были возвращены операцией new
.
Не говоря уже о том, что последующий delete[] array;
вызовет деструктор для всех объектов, которые только что вызвали деструкторы в цикле.
Так что не делайте этого.
Ответ 5
delete [] array
.