7
int* arr = new int[count];

delete arr;

Why does this work? I've checked and it actually frees the memory. From what I've read I need delete[] arr; otherwise it won't actually free all the memory.

4

3 回答 3

13

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

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 等原始类型没有实际影响,但是当您拥有某个类的数组时,差异可能很关键。

于 2013-08-04T19:18:06.523 回答
9

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

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

delete []如果你曾经new T[size];分配过,你应该总是使用。不要将两者混为一谈,这总是错误的——只是有时它会起作用[就像某些以英寸为单位的扳手适用于毫米螺母,反之亦然——但在公制螺母上使用英寸扳手仍然是错误的]。

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

于 2013-08-04T19:15:05.247 回答
3

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

于 2013-08-04T19:13:30.680 回答