为什么编译器需要`delete [] p`和`delete p []`?

Mic*_*x2a 16 c++ language-design dynamic-memory-allocation delete-operator

在C++中,如果要动态分配数组,可以执行以下操作:

int *p;
p = new int[i];  // i is some number
Run Code Online (Sandbox Code Playgroud)

但是,要删除数组,你要...

delete[] p;
Run Code Online (Sandbox Code Playgroud)

为什么不呢delete p[]?这与它最初创建的方式不会更加对称吗?是什么原因(如果有的话)为什么语言是这样设计的?

Mic*_*son 29

一个原因可能是使这些案件更加明显.

int ** p;
delete[] p
delete p[1];
Run Code Online (Sandbox Code Playgroud)

如果它是delete p[]一个字符错误将有相当令人讨厌的后果.

  • 这尤其正确,因为在早期的C++中,你必须指定`[]`中的元素数量. (13认同)
  • @JamesKanze:听起来这就是我的答案.`delete p [4]`是不明确的. (4认同)