为什么C++仍然有一个删除[]和一个删除运算符
Why does C++ still have a delete[] AND a delete operator?
使用单个关键字实现数组删除是否困难?效率低吗?
首先,让我总结一下两者的作用:delete
为一个对象调用析构函数并解除分配内存; delete[]
调用一定数量的对象的析构函数并解除分配内存。
可以将这些折叠到相同的操作中:"调用一定数量的对象的析构函数并释放内存。毕竟一个是某个数字。
delete
和delete[]
都在指针上运行。像这个:
foo* ptr;
仔细看。并告诉我当我们delete
它时应该调用多少个析构函数。你不能。编译器也不能。这只能在运行时知道。有关对象数量的信息必须存储在某个地方。这意味着,对于 new[]
的每次使用,都会分配一些额外的内存来跟踪该数字。
C++建立在"你不用的东西不付费"的原则之上的,这就是非数组形式存在的原因:由于delete
总是只删除一个对象,new
不需要分配任何额外的对象。
问题不在于复杂性,而在于 delete
的参数是单个指针,并且无论您分配单个元素还是数组,该类型都是完全相同的。在实现之下是完全不同的,因为销毁的元素数量不同。
这实际上是与 C 向后兼容的问题......如果从一开始就不是这个要求,我们可能不会C++(它不会赶上这么多),但new T[N]
的类型可能与new T
的类型不同,类型系统可用于检测需要调用哪个delete
。
这是因为C++设计的首要原则之一是你不要为不使用的东西付费。 new[]
/delete[]
有额外费用,并且感觉它们的效用(我在 25 年中从未使用过C++。足够有限,以至于没有理由将此成本添加到非阵列new
/delete
。
如果易于
实现,则不能从语言事件中删除此类功能。在这样的更改之后,您是否自愿来修复我的所有代码?
相关文章:
- 为什么 std::make_shared 无法编译带有已删除运算符 new 的类型?
- 无效删除运算符语法
- C++:如果我重载新运算符,我是否也必须重载删除运算符?
- C++自定义删除运算符不能正常工作?
- 为什么我们甚至需要删除运算符?(我们不能只使用删除[]吗)
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢
- 在这里使用删除运算符是否正确,我很困惑
- 删除运算符
- 使用空实现重写删除运算符
- C ++(为什么)确实移动构造函数删除运算符=
- 如何在 C++ 中使用删除运算符删除单个数据
- 如何通过带有指向基类的指针的删除运算符释放内存
- 删除运算符如何在我的代码中工作
- C++ - 定义自定义新建和删除运算符时make_shared
- 将删除运算符放置在何处以进行动态变量
- C++删除运算符而不"new"
- 如何使用删除 [] 运算符清除动态分配的内存?(无法使用常规删除语法清除)
- 为什么删除运算符在const上下文中使用
- c++是否需要在用户定义和类特定的删除运算符中处理nullptr
- C++ 在覆盖新运算符和删除运算符时不释放数据