如果在C ++中对数组应用“delete”而不是“delete []”,则会产生内存泄漏,因为只会删除第一个元素。但是如果你意外地将“delete []”应用于非数组指针会发生什么?例如(只是一个玩具示例):
class X {
void foo()
{
X* x = new X();
delete[] x; // What happens here?
}
};
它可以造成任何伤害吗?如果是这样,有什么害处?
答案 0 :(得分:1)
如果在C ++中对数组应用“delete”而不是“delete []”,则会产生内存泄漏,因为只会删除第一个元素。
并非总是如此。由于新,新[] ,删除,删除[] 运算符也可以重载,使用delete代替删除[](或其他方式)可以产生巨大的差异。
此外,一些编译器使用{{3>}描述的过度分配技术。因此,对非数组指针应用delete []会导致未定义的行为。
答案 1 :(得分:1)
如果您使用的是需要delete
的简单delete[]
,则不会
有内存泄漏,你有未定义的行为。在很多情况下,你
将破坏自由空间的竞技场,导致后来的程序崩溃,但是
当然,未定义的行为是未定义的,所以任何事情都可能发生。
使用需要简单delete[]
的{{1}}也是未定义的
行为;在实践中,它也经常导致腐败的自由
太空竞技场,或其他丑陋的结果。
当然,在实践中,我无法想到你在哪里
会使用数组new,所以你几乎可以忘记delete
。