如果你说过
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 []
释放,反之亦然。此外,留下悬空的指针也很危险,因此最后一行