Я работал в запуске в течение нескольких лет, где мы запустили с КОМАРЫ , инструмент с открытым исходным кодом, и по существу создали нашу собственную тщательно продуманную систему отслеживания ошибок сверху ее. Аргумент был то, что мы постараемся не тратить много денег в коммерческой системе, и мы соответствовали бы системе отслеживания ошибок точно к нашим потребностям.
, Конечно, это оказалось намного более твердым, чем ожидалось и было большим отвлечением для разработчиков - кто также должен был поддержать систему отслеживания ошибок в дополнение к нашему коду. Это было одним из влияющих факторов к упадку нашей компании.
Вы можете проверить эту ссылку MSDN: оператор удаления [N] . Значение игнорируется.
РЕДАКТИРОВАТЬ Я пробовал этот пример кода на VC9:
int test()
{
std::cout<<"Test!!\n";
return 10;
}
int main()
{
int* p = new int[10];
delete[test()] p;
return 0;
};
Результат: Тест !!
Таким образом, выражение оценивается, но возвращаемое значение игнорируется. Я мягко говоря удивлен, я не могу придумать сценарий, почему это требуется.
массив delete [N]
недействителен. Это не определено в стандарте C ++: раздел 5.3.5 определяет выражение удаления как delete expr
или delete [] expr
, и ничего больше. Он не компилируется на gcc (версия 4.1.2). Относительно того, почему он компилируется в Visual C ++: спросите Microsoft.
Независимо от того, верен ли второй случай, я бы рекомендовал использовать первый, так как он менее подвержен ошибкам.
Visual Studio компилирует многое, чего не должна.
Правильный способ - выполнить delete [] array;
. Я даже не знал, что массив delete [N];
будет компилироваться (и я сомневаюсь, что должен).
Первая точка: там ' s почти никогда не бывает хорошей причиной использовать для начала массив new или delete - вместо этого используйте std :: vector (или какой-либо другой контейнер).
Во-вторых: в темные времена C ++ вам приходилось указывать размер массива, который вы удаляли, поэтому, если вы использовали x = new T [N]
, соответствующее удаление было delete [N] x
. Требование явно указывать размер было снято давно назад, но некоторые компиляторы (особенно те, которые заботятся об обратной совместимости с древним кодом) все еще позволяют это.
Если вам действительно не нужно поддерживать совместимость с древним компилятором (которому около 20 лет), вам не следует его использовать. Опять же, если вам не нужно оставаться совместимым с компилятором, настолько старым, что он не поддерживает никаких стандартных контейнеров, вы не должны ' t использовать в первую очередь форму массива new или delete. Просто остановись!
если работает, это нестандартное расширение.
delete [] array;
- правильная форма.
delete array;
иногда также работает, но зависит от реализации (а значит, неверно).