推荐用new分配连续内存的二维数组:先new int[rowscols]申请一维空间,再new int[rows]创建行指针数组,使matrix[i]指向data+i*cols,支持matrixi访问,delete[] data一次释放全部。

用 new 分配连续内存的二维数组(推荐)
多数人写 new int*[rows] 再循环 new int[cols],看似二维,实则指针数组 + 多段堆内存,容易漏删、缓存不友好。真正高效且易管理的方式是分配一块连续内存,再用指针偏移模拟二维访问。
- 用
int data = new int[rows cols]申请一维连续空间 - 定义行指针数组:
int* matrix = new int[rows] - 每行指向对应起始位置:
matrix[i] = data + i * cols - 使用时仍可写
matrix[i][j],但底层是线性寻址,delete[] data一次释放全部
注意:不能直接 delete[] matrix 后再 delete[] data —— matrix 是指针数组,必须先 delete[] matrix,再 delete[] data;顺序反了会出错。
std::vector<:vector>> 看似方便,但有坑
它语法简洁,支持 vec[i][j],但每个内层 vector 是独立分配的,内存不连续,遍历时 cache miss 高;插入/扩容还可能触发多次重分配。
- 如果只做小规模、读写不频繁的配置表或临时结构,可用
- 若涉及数值计算、图像处理、矩阵运算等性能敏感场景,别用它
- 替代方案:用单个
std::vector存数据,自己算索引:vec[i * cols + j],再封装一个轻量 wrapper 类控制访问
释放时必须匹配分配方式,否则未定义行为
C++ 不允许混用分配与释放方式,这是常见崩溃源头:
立即学习“C++免费学习笔记(深入)”;
-
new[]必须配delete[],不能用delete - 如果用
new int*[rows]+ 循环new int[cols],释放必须两层:for (int i = 0; i - 漏掉任一层,或把
delete[] matrix[i]写成delete matrix[i],都会导致内存泄漏或 heap corruption - 建议:只要没用
std::unique_ptr或 RAII 封装,就在分配后立刻写下对应的释放代码,避免后续遗忘
现代 C++ 更推荐用 std::unique_ptr 管理
手动 new/delete 容易出错,尤其异常路径下。用智能指针可自动释放:
- 连续内存版:
auto data = std::make_unique(rows cols); auto matrix = std::make_unique []>(rows); for (int i = 0; i - 此时无需显式
delete,离开作用域自动清理 - 注意:
std::make_unique分配的是指针数组,不是二维数组本身,仍需手动初始化各行指向(rows)
真正的难点不在怎么写,而在是否意识到「二维」只是逻辑视角——物理内存是否连续、谁负责释放、异常是否安全,这些细节一旦忽略,调试时很难定位。











