如何正确删除已知第二维大小的二维数组?附具体代码疑问
正确的删除方式:
delete[] arr; 直接给你结论:你只需要写delete[] arr;就可以正确释放这个数组,完全不需要循环逐个删除。
为什么不需要循环?
我们来拆解一下你的数组定义:
int (*arr)[100] = new int[100][100];
这里的new int[100][100]是一次性分配了一块连续的内存,用来存储100个长度为100的int数组(也就是总共100*100个int)。它返回的指针类型是int(*)[100]——指向一个长度为100的int数组的指针,这和你定义的arr类型完全匹配。
这种情况下,整个二维数组是作为单个动态数组被分配的,所以只需要一次delete[]就能完整释放这块连续内存。
为什么循环删除是错误的?
你提到的循环删除方式:
for(int i = 0; i < 100; i++) { delete[] arr[i]; } delete[] arr;
这种写法只适用于另一种场景:当你先分配了一个指针数组,再逐个给每个指针分配子数组的时候,比如:
int** arr = new int*[100]; for(int i = 0; i < 100; i++) { arr[i] = new int[100]; }
这种情况下,每个arr[i]都是独立用new[]分配的,所以需要先逐个释放它们,再释放外层的指针数组。
但回到你的代码,arr[i]并不是一个独立分配的动态数组指针——它只是指向你那块连续内存中第i个长度为100的int数组的起始位置。如果你对它调用delete[],相当于试图释放一块不是由new[]单独分配的内存,这属于未定义行为,可能会导致程序崩溃、内存泄漏或者其他奇怪的问题。
总结
- 对于连续分配的二维数组(
new int[N][M]):直接用delete[] arr;释放 - 对于指针数组+逐个分配的子数组:需要先循环
delete[] arr[i],再delete[] arr
内容的提问来源于stack exchange,提问作者Etwus
相关产品推荐
相关产品推荐

