Синтаксис оператора удаления массива C ++ - PullRequest
7 голосов
/ 17 ноября 2009

После того, как я скажу,

Foo* array = new Foo[N];

Я всегда так удалял

delete[] array;

Однако иногда я видел это так:

delete[N] array;

Как это похоже на компиляцию и работу (по крайней мере, в msvc2005), мне интересно Как правильно это сделать? Тогда почему он компилируется иначе?

Ответы [ 7 ]

13 голосов
/ 17 ноября 2009

Вы можете проверить эту ссылку MSDN: оператор удаления [N] . Значение игнорируется.

EDIT Я попробовал этот пример кода на VC9:

int test()
{
    std::cout<<"Test!!\n";
    return 10;
}

int main()
{
    int* p = new int[10];
    delete[test()] p;
    return 0;
};

Вывод: Тест !!

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

10 голосов
/ 17 ноября 2009

delete [N] array недействительно. Это не определено в стандарте C ++: раздел 5.3.5 определяет выражение удаления как delete expr или delete [] expr, и ничего больше. Он не компилируется в gcc (версия 4.1.2). Относительно того, почему он компилируется в Visual C ++: спросите Microsoft.

5 голосов
/ 17 ноября 2009

Прав ли второй случай или нет, я бы порекомендовал использовать первый, поскольку он менее подвержен ошибкам

Visual Studio компилирует много вещей, которые не должны.

5 голосов
/ 17 ноября 2009

delete[] array; - правильная форма.

4 голосов
/ 17 ноября 2009

Первое замечание: почти никогда не бывает веской причины использовать форму массива new или delete для начала - вместо этого используйте std :: vector (или какой-либо другой контейнер).

Во-вторых: в темные времена C ++ вам приходилось указывать размер удаляемого массива, поэтому, если вы использовали x = new T[N], соответствующее удаление было delete [N] x. Требование явного указания размера было удалено long назад, но некоторые компиляторы (особенно те, которые заботятся о обратной совместимости с древним кодом) все еще позволяют это.

Если вам не требуется совместимость с древним компилятором (которому около 20 лет), вы не должны его использовать. Опять же, если вам не нужно оставаться совместимым со столь старым компилятором, который не поддерживает никаких стандартных контейнеров, вы не должны использовать форму массива new или delete в первую очередь. Просто остановись!

4 голосов
/ 17 ноября 2009

Правильный путь - сделать delete[] array;. Я даже не знал, что delete[N] array; будет компилироваться (и я сомневаюсь, что это должно).

0 голосов
/ 17 ноября 2009

, если работает, это нестандартное расширение.

delete [] array;   

это правильная форма.

delete array; 

иногда также работает, но зависит от реализации (следовательно, неправильно).

...