Почему компилятор требует `delete [] p` versus` delete p [] `? - программирование
Подтвердить что ты не робот

Почему компилятор требует `delete [] p` versus` delete p [] `?

В С++, если вы хотите динамически выделять массив, вы можете сделать что-то вроде этого:

int *p;
p = new int[i];  // i is some number

Однако, чтобы удалить массив, вы...

delete[] p;

Почему это не delete p[]? Разве это не было бы более симметричным с тем, как оно было изначально создано? В чем причина (если есть), почему язык был разработан таким образом?

4b9b3361

Ответ 1

Одна из причин могла бы сделать эти случаи более отчетливыми.

int ** p;
delete[] p
delete p[1];

Если бы это было delete p[], то ошибка одного символа имела бы довольно неприятные позывные.

Ответ 2

Поскольку массив переходит в указатель при передаче как параметра функции (или оператора). Таким образом, удаление p [] будет просто эквивалентно удалению p.

[править] Мы можем думать об удалении как о специальном операторе шаблона. Оператор должен иметь возможность разграничивать между p и p [], чтобы выбрать правильную "специализацию" (удаление без массива или массива). Однако правила вывода аргументов шаблона делают этот выбор невозможным (из-за разложения массива мы не можем дистанцироваться между p [] и p при выводе аргумента).

Таким образом, мы не можем использовать оператор с именем delete для обоих casees и необходимо ввести другой оператор delete [] с другим именем (суффикс [] можно рассматривать как часть имени оператора) для случая массива.

[edit 2] Примечание. delete p [] недействителен sintax вообще в соответствии с текущим стандартом. Приведенные выше рассуждения показывают только те проблемы, которые могут возникнуть, если мы попытаемся интерпретировать delete p [] с использованием существующих концепций С++.