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

时间:2013-08-04 19:09:32

标签: c++ memory memory-management memory-leaks

int* arr = new int[count];

delete arr;

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

3 个答案:

答案 0 :(得分:7)

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

这是未定义的行为,并且一如既往,有时 UB似乎有效。在你的情况下,你没有内存中对象的析构函数,所以没有“进一步的工作”,只是释放所有的内存[1]。但是如果你有一个对象有一个有用的析构函数,它(可能)就不会被调用。

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

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

答案 1 :(得分:6)

区别在于分配的内存是否已正确释放 - 无论您是否使用

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这样的原始类型没有实际效果,但是当你有一个类的数组时,差异可能是关键的。

答案 2 :(得分:3)

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