没有括号的C ++删除数组内存仍可正常工作?

C++ delete array memory without brackets still works?

本问题已经有最佳答案,请猛点这里访问。
1
2
3
int* arr = new int[count];

delete arr;

为什么会这样?我已经检查过了,它实际上释放了内存。根据我读到的,我需要delete[] arr;,否则它实际上不会释放所有的内存。


现在尝试用每个100字节的字符串填充数组,看看它是否仍然释放所有分配的内存…

这是未定义的行为,和往常一样,有时UB似乎也会起作用。在您的情况下,内存中的对象没有析构函数,因此没有"进一步的工作",只需释放所有内存[1]。但是,如果有一个对象有一个析构函数可以做一些有用的事情,它(可能)将不会被调用。

如果使用new T[size];进行分配,则应始终使用delete []。不要把二者混用,这总是错误的-只是有时它会起作用[就像一些英寸大小的扳手在毫米螺母上起作用,反之亦然-但在公制螺母上使用英寸扳手仍然是错误的]。

(1)注意这可能适用于这个特定的编译器/C++库组合。用不同的编译器编译它,使用不同的C++库,或者编译一个不同的OS可能会导致它在尝试同样的事情时崩溃。


区别不在于分配的内存是否被正确释放——是否使用

1
delete

1
delete[]

内存仍将被正确释放。

区别在于是否正确调用析构函数。

2

这对int或float之类的基元类型没有实际效果,但是当您有一个类数组时,差异可能非常重要。


delete和delete[]实际上是不同的运算符,使用错误的运算符总是一个错误。问题是,在那个时候它通常看起来很好,但是堆已经损坏了,您很可能在以后遇到一个明显不相关的崩溃。