C++删除不带括号的阵列内存仍然有效
C++ delete array memory without brackets still works?
int* arr = new int[count];
delete arr;
为什么会这样?我已经检查过了,它实际上释放了内存。从我读到的内容来看,我需要delete[] arr;
否则它实际上不会释放所有内存。
区别不在于分配的内存是否正确释放 - 是否使用
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]。但是,如果你有一个对象,它有一个执行有用操作的析构函数,它(可能(不会被调用。
如果您使用new T[size];
来分配,则应始终使用delete []
。不要将两者混为一谈,这总是错误的 - 只是有时它碰巧有效 [就像某些尺寸的扳手(英寸(适用于毫米螺母,反之亦然 - 但在公制螺母上使用英寸扳手仍然是错误的]。
[1] 请注意,这可能适用于此特定的编译器/C++库组合。使用不同的编译器编译它,使用不同的C++库,或针对不同的操作系统编译,可能会导致它在尝试相同操作时崩溃。
删除
和删除[]实际上是不同的运算符,使用错误的运算符总是错误的。问题是当时它通常看起来很好,但堆已经损坏,您以后很可能会遇到明显无关的崩溃。
相关文章:
- 为什么我能够为阵列分配比计算机实际拥有的内存更多的内存
- 为什么删除分配的阵列会导致内存错误?
- 保护类内存阵列以检测分段错误
- 解除分配此特定 2D 阵列的内存
- 内存中的阵列存储
- 内存C++复制是否将内存地址复制到另一个阵列
- 通过"Value Template Argument"与常规阵列在堆栈中分配内存
- OPENCL-如何使辅助功能返回阵列并将内存的部分从恒定内存空间转移到私有
- 动态3维阵列中的内存泄漏
- 复制到新阵列时出现动态内存分配问题
- C++ 清除动态阵列中的内存 - 内存无法清除
- 访问字符阵列中不可用的内存位置(超出范围值)
- 内存堆,动态设置阵列
- 相邻阵列的内存分配
- 如何找到我的阵列使用的内存
- 如何将内存映像分配给DLIB阵列2d或映像
- 动态内存阵列/程序崩溃
- visual C++新与Malloc的对象动态内存阵列
- 需要一个代码来动态分配 >1GB 内存阵列在 Visual Studio C++
- "delete [] pointer"不删除所有内存阵列?