Является ли delete * p альтернативой delete [] p?

Следующий код взят из документации Microsoft

int (**p) () = new (int (*[7]) ());
delete *p;

Я думаю, что вместо этого следует использовать delete [] p.

Является ли delete *p таким же, как delete [] p?

Ответ 1

Этот код недействителен C++, потому что могут быть удалены только указатели на объекты. *p имеет тип int (*)(), который является указателем на функцию, а не указателем на объект.

Даже MSVC сам не компилирует его даже в разрешающем режиме:

error C2541: 'delete': cannot delete objects that are not pointers

Вместо этого они должны были использовать delete [].

Ответ 2

delete *p; не является заменой для delete [] p; ,

Этот код не работает.

Он выделяет массив (из указателей функций). Поскольку это массив, он должен быть удален с помощью delete [] p; , Больше ничего нет.

Ответ 3

  1. Этот код, в частности, имеет другую проблему, так как он пытается удалить внутренний элемент массива, чтобы он не компилировался. Он скомпилируется, если вы напишите delete p, а не delete * p.
  2. Вы можете использовать простое удаление для объекта, выделенного new [], если это массив примитивных типов. Плохая практика, некрасиво, да. Но не ошибка.
  3. Разница между delete и delete [] заключается в том, что последний также вызывает деструкторы. Для примитивных типов, однако, это вызовет простое удаление, чтобы в любом случае освободить внутреннюю память.
  4. Опять же, даже если это работает, вы должны избегать смешивания типов операторов.