【问题标题】:Delete a single array of object?删除单个对象数组?
【发布时间】:2010-03-21 00:21:09
【问题描述】:

我不确定这两个是否都可以删除:

p = new int[1];

delete p

delete [] p;

如果两者都有效,那么以上两个deletes 有什么区别?

【问题讨论】:

  • newdelete 必须匹配,否则您有未定义的行为。似乎在一个平台上工作是未定义行为的可能结果,就像让一切都崩溃一样。不要这样做。

标签: c++ arrays memory-management


【解决方案1】:

一个实例的数组仍然是一个数组。根本没有特殊情况,因此您需要将其视为数组而不是单个对象。非数组delete 可能会崩溃。

对象数组前面可以有一个表示数组大小的数字。如果是这种情况,delete[],而不是delete,足够聪明,可以将正确的指针传递给free

【讨论】:

    【解决方案2】:

    它们相同。即使delete p 会编译,但可能会在运行时导致问题。

    delete p 将调用operator delete(void*),而delete [] 将调用operator delete[](void*)。默认行为是delete[] 调用delete,但是如果已经实现了delete [] 的自定义操作符,如果你只是调用delete 并且你会遇到问题(可能是静默一)。

    良好的经验法则是,如果您在 new 中使用了 [],请在 delete 中使用它。

    【讨论】:

    • 不是经验法则,而是要求。
    【解决方案3】:

    delete p 只删除一个元素。 delete [] p 删除一个数组。如果您使用new type[],则使用delete []

    如果你是 new 有一个 [],那么 delete 有一个 []

    顺便说一句,这个地方必须有一个精确的副本。

    【讨论】:

      猜你喜欢
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多