Они не одинаковы.Хотя delete p
будет компилироваться, но потенциально может вызвать проблемы во время выполнения.
delete p
вызовет operator delete(void*)
, где delete []
вызовет operator delete[](void*)
.По умолчанию delete[]
вызывает delete
, но если реализован пользовательский оператор для delete []
, он не будет вызываться, если вы просто вызовите delete
, и у вас возникнет проблемаone).
Хорошее эмпирическое правило: если вы использовали []
в new
, используйте его в delete
.