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

C++:如何删除用auto声明的二维动态数组?

关于二维动态数组的内存释放问题

嘿,这个问题可太关键了,搞不好就会踩内存泄漏或者未定义行为的坑!咱们一步步理清楚:

首先,先明确你写的auto a = new int[10][10];到底做了什么:

  • 这行代码本质是一次new[]调用,它在堆上分配了一块连续的内存,用来存放10个int[10]类型的数组(也就是总共100个int的空间)。
  • 变量a的实际类型是int (*a)[10](指向int数组的指针),auto帮你自动推导了这个类型。

正确的释放方式:delete[] a;

因为你是用new[](哪怕是二维数组形式的new[])分配的内存,必须用delete[]来匹配释放。这里的delete[]会正确识别整个连续内存块的大小,一次性释放所有100个int的空间,不会留下内存泄漏。

绝对不能用delete a;

如果用delete a,这是用来释放单个对象的操作,但a指向的是一个数组(每个元素是int[10])。这种不匹配的操作会触发未定义行为:

  • 可能只释放了第一个int[10]数组的内存,剩下9个的空间永远泄漏;
  • 更严重的是,可能破坏堆的内部结构,导致程序崩溃、奇怪的内存错误,甚至安全问题。

额外补充:别和另一种二维数组混淆

如果你是这样创建的二维数组:

int** b = new int*[10];
for (int i = 0; i < 10; i++) {
    b[i] = new int[10];
}

那释放的时候就需要先循环delete[]每个子数组,再delete[]外层的指针数组。但你用new int[10][10]创建的是连续的二维数组,只需要一次delete[]就够了。

内容的提问来源于stack exchange,提问作者VanDahlen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:01:01