C++删除不带括号的阵列内存仍然有效

C++ delete array memory without brackets still works?

本文关键字:内存 阵列 有效 删除 C++      更新时间:2023-10-16
int* arr = new int[count];
delete arr;

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

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

delete

delete[]

内存仍将正确解除分配。

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

delete // will only invoke the destructor of the first element of the array.
delete[] // will invoke the destructor for *each* element of the array.

这对于 int 或 float 等基元类型没有实际影响,但是当您有一个包含某个类的数组时,差异可能很关键。

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

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

如果您使用new T[size];来分配,则应始终使用delete []。不要将两者混为一谈,这总是错误的 - 只是有时它碰巧有效 [就像某些尺寸的扳手(英寸(适用于毫米螺母,反之亦然 - 但在公制螺母上使用英寸扳手仍然是错误的]。

[1] 请注意,这可能适用于此特定的编译器/C++库组合。使用不同的编译器编译它,使用不同的C++库,或针对不同的操作系统编译,可能会导致它在尝试相同操作时崩溃。

删除

和删除[]实际上是不同的运算符,使用错误的运算符总是错误的。问题是当时它通常看起来很好,但堆已经损坏,您以后很可能会遇到明显无关的崩溃。