【问题标题】:delete vs delete[] [duplicate]删除与删除 [] [重复]
【发布时间】:2011-05-14 10:12:38
【问题描述】:

可能重复:
( POD )freeing memory : is delete[] equal to delete ?

当我学习 C++ 时,这是很久以前的事了。我被告知永远不要使用delete,但delete[] 在单个对象上执行delete[] 将等效于delete。知道不要太相信老师,我想知道,这是真的吗?

有没有理由打电话给delete 而不是delete[]

我浏览了 SO 中可能相关的问题,但没有找到任何明确的答案。

【问题讨论】:

  • /me 有点呕吐。他们是否建议您也总是调用 new[1]?
  • 当他们说“从不”时不要相信他们。所有强有力的陈述都是错误的。
  • 实际上在少数情况下您需要在 C++ 中使用delete[]。最好使用std::vectorboost::array
  • @Kirill “所有强有力的陈述都是错误的。”这种说法自相矛盾。
  • 我很确定那是他的玩笑。

标签: c++ memory-management delete-operator


【解决方案1】:

来自标准(5.3.5/2):

在第一种选择中(删除 对象),操作数的值 delete 应该是一个指向 非数组对象或指向 表示基础的子对象 (1.8) 此类对象的类别(第 10 条)。 如果不是,则行为未定义。

在第二种选择中(删除 数组),操作数的值 delete 应该是指针值 这是由先前的数组产生的 新表达。 如果不是,则 行为未定义。

所以不:它们绝不是等价的!​​p>

【讨论】:

    【解决方案2】:

    delete []是“vector delete”,对应vector new,即new[]

    您必须使用匹配的分配器对。例如。 malloc/freenew/deletenew[]/delete[],否则你会得到未定义的行为。

    【讨论】:

    • 响应中的“vector”一词应该改为“native C-style array”?否则可能会有点混乱。
    • 不,向量和标量 new/delete 是很好理解的术语。
    【解决方案3】:

    不!分配时调用delete[]new[],否则调用delete

    老师告诉你的会导致未定义的行为,如果幸运的话,还会导致应用程序崩溃。

    【讨论】:

      【解决方案4】:

      delete 用于删除单个对象,而delete[] 用于删除对象数组。查看此link 了解更多信息。

      【讨论】:

        猜你喜欢
        • 2012-07-03
        • 2013-09-26
        • 2018-04-07
        • 2017-09-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多