Far*_*her 5 c++ memory memory-leaks memory-management
int* arr = new int[count];
delete arr;
Run Code Online (Sandbox Code Playgroud)
为什么这样做?我已经检查过,它实际上释放了内存.从我所读到的,我需要,delete[] arr;否则它实际上不会释放所有的记忆.
区别在于分配的内存是否已正确释放 - 无论您是否使用
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之类的原始类型没有实际效果,但是当你有一个类的数组时,差异可能是关键的.
现在尝试用每个100字节的字符串填充数组,看看它是否仍然释放所有分配的内存...
它是未定义的行为,并且一如既往,有时 UB似乎有效.在你的情况下,你没有内存中对象的析构函数,所以没有"进一步的工作",只是释放所有的内存[1].但是如果你有一个对象有一个有用的析构函数,它(可能)就不会被调用.
delete []如果你曾经new T[size];分配,你应该总是使用.不要混淆两者,这总是错误的 - 只是有时它会起作用[就像有些尺寸的扳手以毫米为单位在mm螺母上工作,反之亦然 - 但在公制螺母上使用英制扳手仍然是错误的].
[1]请注意,这可能适用于此特定的编译器/ C++库组合.使用不同的编译器,使用不同的C++库编译它,或者编译不同的操作系统可能会导致它在尝试相同的事情时崩溃.
| 归档时间: |
|
| 查看次数: |
5621 次 |
| 最近记录: |