解除分配数组的不同方法 - c ++

时间:2017-03-02 04:15:16

标签: c++ arrays memory-management

如果你说过

int *arr = new int[5];

之间有什么区别
delete arr;

delete [] arr;

我问这个是因为我试图释放二维数组和

的内存
delete [][] arr; 

似乎没有用,但

delete arr;

似乎工作正常

提前谢谢!

4 个答案:

答案 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::vectorstd::array

2D M x N数组通常应该使用这些容器线性化为1D M*N数组。