推荐用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;顺序反了会出错。
st
d::vector<:vector>> 看似方便,但有坑它语法简洁,支持 vec[i][j],但每个内层 vector 是独立分配的,内存不连续,遍历时 cache miss 高;插入/扩容还可能触发多次重分配。
std::vector 存数据,自己算索引:vec[i * cols + j],再封装一个轻量 wrapper 类控制访问 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 封装,就在分配后立刻写下对应的释放代码,避免后续遗忘 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) 分配的是指针数组,不是二维数组本身,仍需手动初始化各行指向 真正的难点不在怎么写,而在是否意识到「二维」只是逻辑视角——物理内存是否连续、谁负责释放、异常是否安全,这些细节一旦忽略,调试时很难定位。