【问题标题】:What's the result if I use delete p instead of delete [] p for an array? [duplicate]如果我对数组使用 delete p 而不是 delete [] p 会有什么结果? [复制]
【发布时间】:2010-12-27 09:46:44
【问题描述】:

可能的重复:
Why is there a special new and delete for arrays?
( POD )freeing memory : is delete[] equal to delete ?

如果我对数组使用 delete p 而不是 delete [] p 会有什么结果? 我遇到了这个问题的两个答案。

1 只有第一个元素会被释放。

2 灾难性的结局。

我的问题是,这两种情况怎么会发生?如果只释放第一个元素,为什么会有灾难?谁能给我一个例子?

【问题讨论】:

标签: c++


【解决方案1】:

你会得到undefined behavior

【讨论】:

    【解决方案2】:

    这是未定义的行为。

    这意味着标准向内存管理库的编写者保证存在某些先决条件(在这种情况下,将使用 delete [] 删除数组)。

    如果你打破这些先决条件,那么内存管理库可能会以某种方式失败。它如何失败将取决于库的实现方式。但是由于 C++ 是为速度而设计的,因此结果可能不会很好。所以通常这意味着内部内存管理数据结构以某种方式损坏。这可能会导致程序的其他部分出现 sigfaulting。

    如果您在调试模式下构建(在某些编译器上),它们将使用旨在更健壮的内存管理库的特殊版本。因此,在这些情况下,您可能不会崩溃,但额外的检查已明确添加到库中,因此速度较慢。但是你仍然不能保证正确的行为。

    【讨论】:

      【解决方案3】:

      如果只有第一个元素被释放,那么你已经泄露了数组的其余部分。

      经过多次迭代,内存不足。

      另一方面,如果是未定义的行为,那么“灾难性的结局”可能是由于有翼恶魔从你的鼻腔喷出而瞬间死亡。

      【讨论】:

        猜你喜欢
        • 2012-06-27
        • 1970-01-01
        • 1970-01-01
        • 2010-12-09
        • 2020-03-27
        • 2021-08-09
        • 1970-01-01
        • 1970-01-01
        • 2013-02-11
        相关资源
        最近更新 更多