【问题标题】:Why does C++ still have a delete[] AND a delete operator? [closed]为什么 C++ 仍然有一个 delete[] AND 一个删除运算符? [关闭]
【发布时间】:2012-06-15 12:45:31
【问题描述】:

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

【问题讨论】:

  • 我犹豫是否将其标记为不是一个真正的问题,尽管措辞可能不太好,但它确实要求统一背后的技术挑战;我相信这些都可以解决。

标签: c++ arrays memory-management syntax


【解决方案1】:

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

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

deletedelete[] 都对指针进行操作。喜欢这个:

foo* ptr;

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

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

【讨论】:

  • 更准确地说,这是一个遗留问题。 delete(1, ptr)delete(expression, ptr); 是微不足道的,每个人都知道他们有多少元素。
  • Malloc 知道为分配请求分配了多少内存。 delete 可以查阅相同的信息。
  • @R.MartinhoFernandes:如果 C 库被扩展为报告为指针分配了多少内存,那么 C++ 可以很容易地允许 delete 表现得像 delete[],问候。
  • @user315052 不是。即使是这样,malloc 存储的信息也是错误的信息。它是在某个块中分配的存储量,通常与某个特殊边界对齐,因此可能大于在那里构造的对象的实际大小。但是,delete[] 需要的是对象的数量,而不是为它们分配的存储大小。 malloc 没有存储它,因为这在 C 中是无关紧要的:没有析构函数。
  • @DeadMG 真的吗?你应该看看人们在 C 中对字符串做了什么。通常,您不需要(甚至不需要)分配的元素数量,您需要有效元素的数量。如果您不知道要读取多少个chardouble,则分配一百万个并返回指针,计数为10,因为那是您实际读取的内容。
【解决方案2】:

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

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

【讨论】:

  • 我猜 OP 真的在问为什么 new Tnew T[1] 有什么不同。
  • 这可能会导致人们问:“如果我 new 处理一组 Gizmo,我真的想在第一个上调用构造函数吗?”
  • @OliCharlesworth 正如我在回答中所说:new T[1] 有额外的开销,您不必为不用的东西付费。
【解决方案3】:

这是因为 C++ 设计的首要原则之一是你 不要为你不使用的东西付费。 new[]/delete[]有额外费用, 并且感觉它们的实用性(我在 25 年的时间里从未使用过 C++.) 的局限性足以证明将这个成本添加到 非数组new/delete

【讨论】:

    【解决方案4】:

    如果易于实现,就不能从语言事件中删除此类功能。在这样的更改之后,你愿意来修复我所有的代码吗?

    【讨论】:

    • 如果 delete[] 语法已经过时而不丢弃它,他们可能会弃用它,并有一个符合要求的实现委托给另一个。
    • 他们不赞成弃用auto_ptr
    • auto_ptr 是一个库类,而不是语言结构,所以它不一样,如果你问我,强制使有用的功能复杂化是完全愚蠢的。
    猜你喜欢
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2016-07-09
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    相关资源
    最近更新 更多