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

时间:2012-06-26 07:04:24

标签: c++ language-design dynamic-memory-allocation delete-operator

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

int *p;
p = new int[i];  // i is some number

但是,要删除数组,请执行...

delete[] p;

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

2 个答案:

答案 0 :(得分:29)

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

int ** p;
delete[] p
delete p[1];

如果是delete p[]那么一个字符的错误就会产生非常糟糕的后果。

答案 1 :(得分:2)

因为当作为参数传递给函数(或运算符)时,数组衰减到指针。因此删除p []将简单地等同于删除p。

[编辑] 的 我们可能会认为删除特殊模板运算符。操作员应该能够在p和p []之间进行选择以选择正确的“特化”(非数组或数组删除)。但是,模板参数推导规则使得这种选择变得不可能(由于数组衰减,我们在推导参数时不能在p []和p之间解决。)

因此我们不能为两种情况使用名称为 delete 的运算符,并且需要引入另一个运算符delete [],其名称不同(后缀[]可以视为运算符名称的一部分)情况下。

[编辑2] 注意。根据当前标准,删除p []根本不是有效的sintax。上面的推理只显示了如果我们尝试使用现有的c ++概念来解释delete p []的问题。