【问题标题】:Delete without square brackets on dynamic array [duplicate]删除动态数组上没有方括号[重复]
【发布时间】:2020-04-21 09:45:15
【问题描述】:

考虑:

int *p = new int[10];

linked reply 声明:

注意:即使删除 p; 也可以释放内存,但它只会释放第一个元素的内存。

这听起来像delete p 是可以的。它是否正确?我希望delete p 会导致未定义的行为...

【问题讨论】:

  • 内存泄漏不是未定义的行为。
  • 这能回答你的问题吗? Should new/new[] match delete/delete[]?
  • 动态数组被分配为一块连续的内存。删除块中的一个单元是未定义的行为,维护内存分配很痛苦(即如何将数组的内存单元标记为已删除但保留所有其他单元?)。
  • C++11 第 5.3/2 段:“[...] 在第一种选择(删除对象)中,delete 的操作数的值可能是空指针值,指向由先前的 new 表达式创建的非数组对象,或指向表示此类对象的基类(子句 [class.derived])的子对象([intro.object])的指针。如果不是,则行为未定义。 [...]"
  • UB 使用的delete 版本与new 不匹配。

标签: c++ dynamic-arrays


【解决方案1】:

不行,陈述不正确。

在来自new[] 的指针(或者实际上,任何不是来自new 的指针)上使用delete 的行为是未定义的。应该改用delete[]

【讨论】:

    猜你喜欢
    • 2019-12-30
    • 2018-12-12
    • 1970-01-01
    • 2018-05-13
    • 2014-01-28
    • 2022-10-13
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    相关资源
    最近更新 更多