【问题标题】:Is it ok to "delete" memory allocated with "new[1]" and vice-versa? [duplicate]是否可以“删除”分配有“new[1]”的内存,反之亦然? [复制]
【发布时间】:2014-10-16 12:30:07
【问题描述】:

这段代码合法吗?

int * a = new int[1];
delete a;

还是这个?

int * a = new int;
delete [] a;

显然,这似乎不正确,至少应该不鼓励这样做,但它会导致任何实际问题(内存泄漏等)吗?

【问题讨论】:

  • 如果delete 与任何表达式一起工作,为什么会有人打扰使用delete[]?答案是否定的,这是不行的,因为它会导致未定义的行为。
  • 我知道我可以写一个内存管理器来解决这个问题。您想知道哪个特定的内存管理器/编译器会/可能是一个问题?
  • 为什么要投反对票?他问了一个合理的问题。你得到了赞成票。
  • @liran63 "这个问题没有显示任何研究工作"

标签: c++ c++11 memory new-operator delete-operator


【解决方案1】:

匹配的组合必须是:-

new; delete;

new[]; delete[];

如果你把它们混在一起,你会得到未定义的行为。我已经看到代码因此而爆炸。

【讨论】:

  • 如果我可以在“代码爆炸”中添加一些无用的琐事 - 这个错误出现在红色警报 2 的发货版本中(在之前的游戏中遗留的一个未使用的功能中)系列)。如果该功能被激活,它确实会导致游戏崩溃,并且通过 IDA 和 WinDBG 追踪它很有趣。
【解决方案2】:

没有。如果你new 你应该delete。如果你new[] 你应该delete[]

【讨论】:

  • 我知道我应该,这是我自己明确写的。我的问题是问这是否会导致任何问题(以及它们究竟会是什么)。
  • 如果混合使用会导致未定义的行为。
  • 您的堆很可能会损坏,您会看到随机点发生崩溃。
【解决方案3】:

混合标量和数组(取消)分配运算符会导致未定义的行为。 delete 和 delete[] 之间的一个明确区别是后者为数组的所有元素调用析构函数。

http://www.cplusplus.com/reference/new/operator%20delete[]/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 2013-08-01
    • 2015-09-13
    • 2019-11-09
    • 1970-01-01
    相关资源
    最近更新 更多