Я думаю, что вместо этого следует использовать 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
Этот код, в частности, имеет другую проблему, так как он пытается удалить внутренний элемент массива, чтобы он не компилировался. Он скомпилируется, если вы напишите delete p, а не delete * p.
Вы можете использовать простое удаление для объекта, выделенного new [], если это массив примитивных типов. Плохая практика, некрасиво, да. Но не ошибка.
Разница между delete и delete [] заключается в том, что последний также вызывает деструкторы. Для примитивных типов, однако, это вызовет простое удаление, чтобы в любом случае освободить внутреннюю память.
Опять же, даже если это работает, вы должны избегать смешивания типов операторов.