为什么编译器需要“删除 [] p”而不是“删除 p[]”
Why does the compiler require `delete [] p` versus `delete p[]`?
在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[] 时可能出现的问题。
相关文章:
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 为什么示例代码访问IUnknown中已删除的内存
- 为什么我的删除节点函数实际上没有删除节点?
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 为什么缓冲区的内容在读取空 rdbuf 时被删除?
- 为什么"delete"关键字不删除节点?
- 为什么我的双向链表删除函数会删除多个节点?
- 我叫删除,但我的d-tor没有叫,为什么?
- 为什么每当我尝试运行此链接列表删除功能时都会收到分段错误错误?
- 为什么通过 vector<reference_wrapper> 的元素删除引用的值<T>不会使向量无效?
- 为什么 std::make_shared 无法编译带有已删除运算符 new 的类型?
- 为什么我的程序在读取/写入文件时会删除最重要的数字?
- 为什么在删除"移动构造函数"时使用"复制构造函数"?
- 为什么"std::add_pointer"会添加之前删除的"const"?
- 为什么用绕道钩住堆免费对删除/免费不起作用?
- 当类型适当的构造函数可用时,为什么一个编译器尝试使用已删除的副本构造函数
- 为什么基类中的复制和交换会导致派生类中的复制赋值运算符被隐式删除?
- shared_ptr删除器类 - 为什么要复制删除器?
- 调用应用程序libjingle,用户自动从花名册中删除.为什么?