为什么C ++仍然有delete []和delete运算符?

时间:2012-06-12 15:36:51

标签: c++ arrays memory-management syntax

使用单个关键字实现删除数组难吗?它的效率会降低吗?

4 个答案:

答案 0 :(得分:16)

首先,让我总结两者的作用:delete调用一个对象的析构函数并释放内存; delete[]调用一些个对象的析构函数并释放内存。

可以将它们折叠到同一个操作中:“调用一些个对象的析构函数并释放内存。”毕竟一个一些号码。

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

foo* ptr;

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

C ++建立在“你不为你不使用的东西买单”的原则之上,这就是存在非数组形式的原因:因为delete总是只删除一个对象,{{1不需要分配任何额外的。

答案 1 :(得分:6)

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

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

答案 2 :(得分:5)

这是因为C ++设计的首要原则之一就是你 不要为你不使用的东西买单。 new[] / delete[]需要额外费用, 并且感觉到他们的实用性(我在25年的时间里从未使用过 C ++。)足够有限,以至于没有理由将这笔费用加到 非数组new / delete

答案 3 :(得分:-3)

这样的功能如果易于实现,就不能从语言事件中删除。在这样的改变之后,您是否自愿来修复我的所有代码?