如果你说过
int *arr = new int[5];
之间有什么区别
delete arr;
和
delete [] arr;
我问这个是因为我试图释放二维数组和
的内存delete [][] arr;
似乎没有用,但
delete arr;
似乎工作正常
提前谢谢!
答案 0 :(得分:2)
如果你说过
int arr[5];
之间有什么区别
delete arr;
和
delete [] arr;
其中一个额外有一对括号。两者都可能崩溃和/或破坏堆。这是因为arr
是一个局部变量,不能delete
d - delete
仅适用于使用new
分配的内容。
delete [][] arr;
是无效的语法。对于使用new int[2][2]
分配的数组,请使用delete []
。
答案 1 :(得分:1)
这两项删除都不正确。
当您声明这样的数组时:
int arr[5];
空间在stack
上分配。堆栈上分配的内存不会被删除清除。当堆栈在范围退出时展开时,它会自动清理(尽管在技术上干净不是正确的术语)。 (检查When is an object "out of scope"?)
如果你像这样删除你的数组:
int *arr = new int[5]; // new allocates memory on heap
你打电话
delete[] arr; // this takes care of cleaning up memmory on **heap**
答案 2 :(得分:0)
我假设您的意思是new int[5]
,并且动态内存的new
相同。否则,您正在使用堆栈,而不是堆,并且删除未定义
虽然delete arr
似乎适用于二维数组,但我认为该标准需要以下内容:
delete [] arr
arr=nullptr
这是因为分配有new []
的内存必须使用delete []
释放,反之亦然。另外,留下悬空指针是危险的,因此最后一行
答案 3 :(得分:0)
new type
需要delete
new type[size]
需要delete []
使用一个而不是另一个是错误的。
顺便说一句,除非你有充分的理由,否则你不应该使用这样的原始指针。请改用std::vector
或std::array
。
2D M
x N
数组通常应该使用这些容器线性化为1D M*N
数组。