为什么编译器需要“删除 [] p”而不是“删除 p[]”

Why does the compiler require `delete [] p` versus `delete p[]`?

本文关键字:删除 为什么 编译器      更新时间:2023-10-16

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

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

但是,要删除阵列,您需要...

delete[] p;

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

一个原因可能是使这些情况更加明显。

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

如果它是delete p[]那么一个字符的错误将产生非常令人讨厌的后果。

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

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

因此,我们不能对两种情况都使用带有名称删除的运算符,并且需要为数组大小写引入另一个具有不同名称的运算符 delete[](后缀 [] 可以被视为运算符名称的一部分)。

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

相关文章: