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

Far*_*her 5 c++ memory memory-leaks memory-management

int* arr = new int[count];

delete arr;
Run Code Online (Sandbox Code Playgroud)

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

Zen*_*gix 8

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

delete
Run Code Online (Sandbox Code Playgroud)

要么

delete[]
Run Code Online (Sandbox Code Playgroud)

内存仍将被正确释放.

不同之处在于是否可以正确调用析构函数.

delete // will only invoke the destructor of the first element of the array.

delete[] // will invoke the destructor for *each* element of the array.
Run Code Online (Sandbox Code Playgroud)

这对于诸如int或float之类的原始类型没有实际效果,但是当你有一个类的数组时,差异可能是关键的.

  • 没有文档,只有我自己的经验是使用Visual C++.有一段时间,但我记得面对错误,因为我错误地使用删除而不是删除[].很确定它表现得像我描述的那样......请记住*x取消引用与x [0]相同的位置,并将x声明为指向目标对象是标量还是数组的任何内容的指针,因此删除运算符我不知道它必须破坏一个对象数组与一个标量对象,除非你通过适当的删除结构告诉它. (2认同)

Mat*_*son 7

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

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

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

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