2010-03-21 4 views
2

Я не уверен, что если обе эти работы, чтобы удалить:Удалить один массив объектов?

p = new int[1]; 

delete p 

и

delete [] p; 

Если оба произведения, в чем разница между этими двумя delete с?

+1

«new» и 'delete' должны совпадать, или у вас есть неопределенное поведение. Попытка работать на одной платформе - это возможный результат неопределенного поведения, а также грохот всего ужасного. Не делай этого. – GManNickG

ответ

1

delete p удаляет только один элемент. delete [] p удаляет массив. Если вы используете new type[], используйте delete [].

Если у вас new есть [], то delete имеет [].

Кстати, должно быть точное дублирование этого.

4

Массив одного экземпляра по-прежнему представляет собой массив. Просто нет особого случая, поэтому вам нужно рассматривать его как массив, а не отдельный объект. Неархиво delete может вылететь из строя.

Множество объектов может предшествовать число, обозначающее размер массива. Если это так, delete[], а не delete, достаточно умен, чтобы передать правильный указатель на free.

2

Это не такие же. Несмотря на то, что delete p будет компилироваться, но может потенциально вызвать проблемы во время выполнения.

delete p будет ссылаться на operator delete(void*), где delete [] позвонит operator delete[](void*). По умолчанию используется значение delete[] для вызова delete, но если пользовательский оператор для delete [] был реализован, он не будет вызываться, если вы просто вызываете delete, и у вас будет проблема (возможно, тихая).

Хорошее эмпирическое правило, если вы использовали [] в new, используйте его в delete.

+0

Не правило, требование. – GManNickG

Смежные вопросы