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