Подтвердить что ты не робот

Delete [] массив объектов

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

Objects *array = new Objects[N];

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

delete[] array;

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

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

Спасибо

UPDATE:

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

delete &array[i];

чтобы заставить компилировать код.

4b9b3361

Ответ 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

.