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

C++中释放int二维数组:delete[]释放字节数及段错误疑问

关于二维数组内存释放的疑问解答

先明确你的代码里的内存分配逻辑:allocate函数中,首先分配了一个包含rows个int*的数组(由mat指向),接着分配了一块连续的、能容纳rows*cols个int的内存(由temp指向),最后让mat[i]指向这块连续内存的第i*cols个int位置——也就是说,mat[0]、mat[1]……mat[rows-1]都是同一块连续内存的不同偏移指针,只有mat[0]是new[]返回的原始起始指针。

问题1:delete[] mat[0];会释放多少字节?

mat[0]就是分配连续内存时new int[rows*cols]返回的起始指针,所以delete[] mat[0]会释放整个连续内存块,总字节数是 rows * cols * sizeof(int)。
以你的例子rows=5,cols=5为例,就是5*5*4=100字节(假设sizeof(int)=4,不同平台可能有差异)。

问题2:执行delete[] mat[0];后再调用delete[] mat[1];为什么触发段错误?

原因有两点:

  • C++的内存规则要求:delete[]必须和new[]返回的原始起始指针配对使用。mat[1]是原始内存块的偏移指针,不是new[]返回的起始地址,直接对它调用delete[]本身就是未定义行为。
  • 调用delete[] mat[0]时,已经把整个连续内存块释放了,此时mat[1]指向的内存已经属于无效内存。再次对无效内存调用delete[],会触发内存访问错误(段错误),本质是重复释放/释放非法指针导致的内存管理混乱。

正确的释放步骤

你需要分两步释放:

delete[] mat[0]; // 释放底层的连续int内存块
delete[] mat;    // 释放存储指针的数组

内容的提问来源于stack exchange,提问作者Z.Lun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 06:42:38