如果我对数组使用 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[] 是不是安全? [复制]
C++中Delete用法:请问int *p=new int(5); 此时delete的形式是delete []p还是delete p;