释放数组的不同方法 - c++
Different ways to deallocate an array - c++
如果你说过
int *arr = new int[5];
两者之间有什么区别
delete arr;
和
delete [] arr;
我问这个是因为我试图释放 2d 数组的内存,并且
delete [][] arr;
似乎不起作用,但
delete arr;
似乎工作正常
提前谢谢你!
new type
需要delete
new type[size]
需要delete []
使用一个而不是另一个是错误的。
顺便说一句,除非你有很好的理由,否则你不应该使用这样的原始指针。请改用std::vector
或std::array
。
2DM
xN
阵列通常应线性化为 1DM*N
阵列,也使用这些容器。
如果你说过
int arr[5];
两者之间有什么区别
delete arr;
和
delete [] arr;
一个里面有一对额外的括号。两者都可能会崩溃和/或损坏堆。这是因为arr
是一个局部变量,不能delete
d -delete
仅适用于分配了new
的东西。
delete [][] arr;
不是有效的语法。对于分配了例如new int[2][2]
的数组,请使用delete []
。
删除操作都不正确。
当你声明一个这样的数组时:
int arr[5];
空间分配在stack
上。堆栈上分配的内存不会通过删除进行清理。当堆栈在退出范围时展开时,它会自动清洁(尽管清洁在技术上不是正确的术语)。(检查对象何时"超出范围"?
如果你像这样描述你的数组:
int *arr = new int[5]; // new allocates memory on heap
你打电话
delete[] arr; // this takes care of cleaning up memmory on **heap**
我假设你的意思是new int[5]
,以及动态内存的相同new
。否则,您使用的是堆栈,而不是堆,并且删除是未定义的
虽然delete arr
似乎适用于 2-D 数组,但我相信该标准需要以下内容:
delete [] arr
arr=nullptr
这是因为分配了new []
的内存必须通过delete []
释放,反之亦然。此外,留下悬空的指针也很危险,因此最后一行
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 初始化具有非默认构造函数的std::数组项的更好方法