正确步骤是先用 new int*[rows] 分配行指针数组,再对每行单独 new int[cols];这种方式确保每行独立且支持 arri 访问,单次分配无法满足要求。

int** 动态分配二维矩阵的正确步骤
直接用 new int*[rows] 分配行指针数组,再对每行单独 new int[cols],这是唯一能保证每行独立、支持 arr[i][j] 访问的方式。别试图用单次 new int[rows * cols] 然后强转成 ——那根本不是二维指针,解引用会崩溃。
为什么不能用 int** arr = (int**)new int[rows * cols]
这种写法在语义和内存布局上完全错误:int** 是指针的指针,它期望每个 arr[i] 是一个有效的 int* 地址;而 new int[rows * cols] 返回的是 int*,强制转成 int** 后,arr[0] 会把前 4 或 8 字节(取决于平台)解释成地址,大概率是非法内存,一访问就 segmentation fault。
释放时必须两级 delete,且顺序不能反
对应分配逻辑,释放必须先逐行 delete[] arr[i],再 delete[] arr。漏掉任意一层都会内存泄漏;如果先 delete[] arr,后续再遍历 arr[i] 就是野指针访问。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 分配示例:
int** arr = new int*[rows]; for (int i = 0; i
- 释放示例:
for (int i = 0; i
- 访问安全:只要
0 且 <code>0 ,<code>arr[i][j]就是合法的
实际项目中更推荐用 std::vector<:vector>></:vector>
手动管理 int** 容易出错,尤其异常路径下容易漏 delete。而 std::vector 自动析构,支持移动,且语法一致:vec[i][j]。唯一代价是每行有小量额外开销(约 24 字节),但绝大多数场景远比内存泄漏或崩溃值得。
如果真要极致性能且行列固定,用一维 std::vector<int></int> + 手动索引 data[i * cols + j],比 int** 更快也更安全。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










