删除与删除 [] [重复]
Posted
技术标签:
【中文标题】删除与删除 [] [重复]【英文标题】: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::vector
或boost::array
。
@Kirill “所有强有力的陈述都是错误的。”这种说法自相矛盾。
我很确定那是他的玩笑。
【参考方案1】:
来自标准(5.3.5/2):
在第一种选择中(删除 对象),操作数的值 delete 应该是一个指向 非数组对象或指向 表示基础的子对象 (1.8) 此类对象的类别(第 10 条)。 如果不是,则行为未定义。
在第二种选择中(删除 数组),操作数的值 delete 应该是指针值 这是由先前的数组产生的 新表达。 如果不是,则 行为未定义。
所以不:它们绝不是等价的!p>
【讨论】:
【参考方案2】:delete []
是“vector delete”,对应vector new,即new[]
。
您必须使用匹配的分配器对。例如。 malloc/free
、new/delete
、new[]/delete[]
,否则你会得到未定义的行为。
【讨论】:
响应中的“vector”一词应该改为“native C-style array”?否则可能会有点混乱。 不,向量和标量 new/delete 是很好理解的术语。【参考方案3】:不!分配时调用delete[]
new[]
,否则调用delete
。
老师告诉你的会导致未定义的行为,如果幸运的话,还会导致应用程序崩溃。
【讨论】:
【参考方案4】:delete
用于删除单个对象,而delete[]
用于删除对象数组。查看此link 了解更多信息。
【讨论】:
以上是关于删除与删除 [] [重复]的主要内容,如果未能解决你的问题,请参考以下文章