【问题标题】:Should new/new[] match delete/delete[]?new/new[] 应该匹配 delete/delete[] 吗?
【发布时间】:2011-05-27 17:08:10
【问题描述】:

我知道当我们使用new/new[]分配内存时,我们应该分别使用delete/delete[]来释放内存。

问题来了,

可以用delete[]释放new分配的内存吗?

例如,

int *pInt3 = new int;
delete [] pInt3;
pInt3 = NULL;

T *pT3 = new T;
delete [] pT3;
pT3 = NULL;

谢谢

【问题讨论】:

  • 既然已经知道答案,为什么还要问这个问题?
  • 如果可能的话,删除 [] 和删除没有任何意义。
  • @wnoise,我问的原因是 new int 或 new T 是创建一个大小为 1 的数组。因此,如果使用 delete[],它似乎应该可以工作。 -- 谢谢
  • q0987:为什么要浪费时间想知道它在某些特定情况下是否可行?只需使用delete 的匹配表并继续您的工作。当然,除了关于new/delete/new[]/delete[]i++ = ++i + i++ 的反复出现的SO 问题之外,还有更多有趣的编程方面需要讨论。
  • q0987: 不,T类型的单个对象和大小为1的T类型的数组是有区别的。数据的实际内存分配可能是相同的(一项类型T),但是围绕分配的数据的簿记不太可能完全一样。特别是,对于长度为 1 的数组,需要将长度为 1 的数组存储在某处,但它不适用于单个元素。

标签: c++


【解决方案1】:

我猜你除了参考标准之外什么都不满意,所以在这里。

您可以在 Standard for C++03 的 3.7.3.2 下找到它。

3 提供给标准库中提供的一个释放函数的第一个参数的值可能是空指针值;如果是这样,对释放函数的调用无效。否则,在标准库中提供给 operator delete(void*) 的值应是先前调用标准库中 operator new(size_t) 或 operator new(size_t, const std::nothrow_t&) 返回的值之一, 和 标准库中提供给 operator delete[] (void*) 的值应该是之前调用 operator new[] (size_t) 或 operator new[] (size_t, const) 返回的值之一标准库中的 std::nothrow_t&)

所以你的问题的答案是否定的。

【讨论】:

  • 能否给我一个链接,以便我可以参考 C++ 标准的上述描述?
  • @q0897 - 你必须得到一份标准的副本,30 美元。
  • 我在webstore.ansi.org 购买了我的。您可以在此处获得下一个标准的草案(免费):www2.research.att.com/~bs/SC22-N-4411.pdf。在该文档中,您可以在 3.7.4.2 下的第 3 项下找到它。
【解决方案2】:

我可以使用 delete[] 来释放 新分配的内存?

是的,你可以,但如果你这样做了,你会后悔的。

【讨论】:

    【解决方案3】:

    不,您应该将new 的非数组形式与非数组delete 匹配,数组形式也是如此。

    C++ FAQ Lite section on Freestore Management

    这个特别好:http://www.parashift.com/c%2B%2B-faq-lite/freestore-mgmt.html#faq-16.12

    [16.12] 如果删除通过new T[n]分配的数组时忘记了[]怎么办?

    所有生命都以灾难性的方式结束。

    让new T[n] 和delete[] p 之间的连接正确是程序员而不是编译器的责任。如果你弄错了,编译器既不会生成编译时错误消息,也不会生成运行时错误消息。堆损坏是一个可能的结果。或者更糟。你的程序可能会死掉。

    【讨论】:

    • 其实我关心的不是16.12。我的问题是如果我在删除分配的对象时总是使用 [] 怎么办。 ——谢谢
    • @q0987 - new [] 的实现方式可能与标量 new 的实现方式不同,并且根据 C++03 标准,在未分配相应 @ 的指针上调用 delete[] 987654328@ 调用未定义。
    猜你喜欢
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    相关资源
    最近更新 更多