You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确删除已知第二维大小的二维数组?附具体代码疑问

正确的删除方式: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:43:17