如果我对数组使用 delete p 而不是 delete [] p 会有啥结果? [复制]

Posted

技术标签:

【中文标题】如果我对数组使用 delete p 而不是 delete [] p 会有啥结果? [复制]【英文标题】: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 灾难性的结局。

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

【问题讨论】:

这是未定义的行为。以前在这里也被问过无数次。请参阅***.com/questions/659270/… 等等。 【参考方案1】:

你会得到undefined behavior

【讨论】:

【参考方案2】:

这是未定义的行为。

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

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于如果我对数组使用 delete p 而不是 delete [] p 会有啥结果? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 POD 数组上使用 delete 而不是 delete[] 是不是安全? [复制]

python中del 语句的用法?

C++中Delete用法:请问int *p=new int(5); 此时delete的形式是delete []p还是delete p;

python del 的用法

数组的方法push、pop、unshift、shift、delete、splice

Swift 减少元组数组自定义数据模型