为什么C++仍然有一个删除[]和一个删除运算符

Why does C++ still have a delete[] AND a delete operator?

本文关键字:删除 运算符 一个 C++ 有一个 为什么      更新时间:2023-10-16

使用单个关键字实现数组删除是否困难?效率低吗?

首先,让我总结一下两者的作用:delete一个对象调用析构函数并解除分配内存; delete[]调用一定数量的对象的析构函数并解除分配内存。

可以将这些折叠到相同的操作中:"调用一定数量的对象的析构函数并释放内存。毕竟一个某个数字。

deletedelete[]都在指针上运行。像这个:

foo* ptr;

仔细看。并告诉我当我们delete它时应该调用多少个析构函数。你不能。编译器也不能。这只能在运行时知道。有关对象数量的信息必须存储在某个地方。这意味着,对于 new[] 的每次使用,都会分配一些额外的内存来跟踪该数字。

C++建立在"你不用的东西不付费"的原则之上的,这就是非数组形式存在的原因:由于delete总是只删除一个对象,new不需要分配任何额外的对象。

问题不在于复杂性,而在于 delete 的参数是单个指针,并且无论您分配单个元素还是数组,该类型都是完全相同的。在实现之下是完全不同的,因为销毁的元素数量不同。

这实际上是与 C 向后兼容的问题......如果从一开始就不是这个要求,我们可能不会C++(它不会赶上这么多),但new T[N]的类型可能与new T的类型不同,类型系统可用于检测需要调用哪个delete

这是因为C++设计的首要原则之一是你不要为不使用的东西付费。 new[]/delete[]有额外费用,并且感觉它们的效用(我在 25 年中从未使用过C++。足够有限,以至于没有理由将此成本添加到非阵列new/delete

如果易于

实现,则不能从语言事件中删除此类功能。在这样的更改之后,您是否自愿来修复我的所有代码?