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
相关产品推荐
相关产品推荐

