16

在 C++ 中,如果你想动态分配一个数组,你可以这样做:

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

但是,要删除数组,您可以...

delete[] p;

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

4

2 回答 2

29

一个原因可能是使这些案例更加不同。

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

如果是这样,delete p[]那么一个字符错误将产生非常严重的后果。

于 2012-06-26T07:08:59.557 回答
2

因为数组作为参数传递给函数(或运算符)时会衰减为指针。所以 delete p[] 就等同于 delete p。

[编辑] 我们可以将删除视为特殊的模板运算符。操作员应该能够区分 p 和 p[] 以选择正确的“特化”(非数组或数组删除)。但是,模板参数推导规则使这种选择成为不可能(由于数组衰减,我们在推导参数时无法区分 p[] 和 p)。

所以我们不能对这两种情况都使用名称为delete的运算符,而需要为数组情况引入另一个名称不同的运算符delete[](后缀[]可以视为运算符名称的一部分)。

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

于 2012-06-26T09:51:01.553 回答