Синтаксис оператора delete массива C++

Я работал в запуске в течение нескольких лет, где мы запустили с КОМАРЫ , инструмент с открытым исходным кодом, и по существу создали нашу собственную тщательно продуманную систему отслеживания ошибок сверху ее. Аргумент был то, что мы постараемся не тратить много денег в коммерческой системе, и мы соответствовали бы системе отслеживания ошибок точно к нашим потребностям.

, Конечно, это оказалось намного более твердым, чем ожидалось и было большим отвлечением для разработчиков - кто также должен был поддержать систему отслеживания ошибок в дополнение к нашему коду. Это было одним из влияющих факторов к упадку нашей компании.

7
задан Jon Seigel 10 April 2010 в 18:16
поделиться

7 ответов

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

РЕДАКТИРОВАТЬ Я пробовал этот пример кода на VC9:

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

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

Результат: Тест !!

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

13
ответ дан 6 December 2019 в 05:06
поделиться

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

10
ответ дан 6 December 2019 в 05:06
поделиться

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

5
ответ дан 6 December 2019 в 05:06
поделиться

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

Visual Studio компилирует многое, чего не должна.

5
ответ дан 6 December 2019 в 05:06
поделиться

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

4
ответ дан 6 December 2019 в 05:06
поделиться

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

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

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

4
ответ дан 6 December 2019 в 05:06
поделиться
​​

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

delete [] array;   

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

delete array; 

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

-2
ответ дан 6 December 2019 в 05:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: