释放数组的不同方法 - c++

Different ways to deallocate an array - c++

本文关键字:方法 c++ 数组 释放      更新时间:2023-10-16

如果你说过

int *arr = new int[5];

两者之间有什么区别

delete arr;

delete [] arr;

我问这个是因为我试图释放 2d 数组的内存,并且

delete [][] arr; 

似乎不起作用,但

delete arr;

似乎工作正常

提前谢谢你!

new type需要delete
new type[size]需要delete []
使用一个而不是另一个是错误的。

顺便说一句,除非你有很好的理由,否则你不应该使用这样的原始指针。请改用std::vectorstd::array

2DMxN阵列通常应线性化为 1DM*N阵列,也使用这些容器。

如果你说过

int arr[5];

两者之间有什么区别

delete arr;

delete [] arr;

一个里面有一对额外的括号。两者都可能会崩溃和/或损坏堆。这是因为arr是一个局部变量,不能deleted -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 []释放,反之亦然。此外,留下悬空的指针也很危险,因此最后一行