C++中“不规则数组”指每行长度不同、内存不连续的二维结构,非标准类型,常用std::vector嵌套实现,需逐行初始化并检查边界,手动管理int**易致内存泄漏和越界。

什么是C++里的“不规则数组”
严格来说,C++标准里没有“Jagged Array”这个类型——它只是对std::vector<:vector>></:vector>或T**这类动态二维结构的俗称。关键在于:每行长度可以不同,内存不连续,不能用int arr[][N]这种C风格固定列数的声明来处理。
真正要用,得靠指针手动管理或容器嵌套。前者容易出错,后者更安全但要注意拷贝和移动语义。
用std::vector<:vector>></:vector>构造和访问
这是最常用、也最推荐的方式。它自动管理内存,支持范围for、迭代器,且能动态增删行/列。
- 初始化时不要写成
std::vector<:vector>>(3, std::vector<int>(5))</int></:vector>——这会创建规则矩形,不是“不规则”的本意 - 要真正不规则,得逐行push:
std::vector<std::vector<int>> jagged = { {1, 2}, {3, 4, 5, 6}, {7} }; - 访问元素前务必检查
row.size(),否则jagged[i][j]可能越界(尤其当某行为空时) - 如果频繁按列遍历,性能会差——因为每行内存不连续,CPU缓存不友好
用int**手动管理的坑
只有在对接C API、做极致性能优化或嵌入式受限环境时才考虑。绝大多数情况下,它带来的维护成本远超收益。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
- 分配时必须两步:先
new int*[rows],再对每行new int[col_count[i]];释放时顺序相反,漏一步就内存泄漏 -
delete[]和delete不能混用:delete[] ptr用于数组,delete ptr用于单对象——int**中第一层是int*数组,第二层是int数组,两者都得用delete[] - 无法自动知道某行长度,必须额外维护一个
int* cols数组,或约定每行末尾加哨兵值(如-1),否则遍历时极易越界 - 不能直接传给期望
int[][]或int(*)[N]的函数——类型不兼容,编译失败
需要“类数组”接口时怎么办
如果业务代码里大量出现jagged[i][j]访问,又想避免重复边界检查,可以封装一层轻量包装:
struct JaggedView {
std::vector<std::vector<int>>& data;
int at(int i, int j) const {
if (i < 0 || i >= data.size()) throw std::out_of_range("row");
if (j < 0 || j >= data[i].size()) throw std::out_of_range("col");
return data[i][j];
}
};注意:别试图重载operator[]返回代理对象来支持obj[i][j]——实现复杂、易出引用悬空,且现代C++更倾向显式检查或用at()。
真正的难点不在构造,而在生命周期管理:谁拥有数据?是否允许移动?是否需要线程安全?这些一旦模糊,bug就藏在深夜调试里。

















