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.
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.
区别不在于分配的内存是否被正确释放——你是否使用
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]。但是如果你有一个对象有一个析构函数可以做一些有用的事情,它(可能)不会被调用。
delete []
如果你曾经new T[size];
分配过,你应该总是使用。不要将两者混为一谈,这总是错误的——只是有时它会起作用[就像某些以英寸为单位的扳手适用于毫米螺母,反之亦然——但在公制螺母上使用英寸扳手仍然是错误的]。
[1] 请注意,这可能适用于这个特定的编译器/C++ 库组合。用不同的编译器编译它,使用不同的 C++ 库,或为不同的操作系统编译可能会导致它在你尝试相同的事情时崩溃。
delete 和 delete [] 实际上是不同的运算符,使用错误的运算符总是错误的。问题是它在当时看起来通常很好,但是堆已经损坏,你很可能会在以后遇到明显不相关的崩溃。