std::vector 是创建二维数组最安全的标准做法,推荐写法为 std::vector matrix(rows, std::vector(cols, 0)),自动管理内存并避免野指针和泄漏。

用 std::vector 创建二维数组最安全
手动管理内存的二维数组容易出错,std::vector 是 C++ 标准做法。它自动处理构造、析构和边界检查,避免野指针和内存泄漏。
- 推荐写法:
std::vector<:vector>> matrix(rows, std::vector<int>(cols, 0));</int></:vector>—— 所有元素初始化为 0 - 如果只初始化行数,列数留空:
std::vector<:vector>> matrix(rows);</:vector>,之后用matrix[i].resize(cols)补齐 - 注意:这种嵌套
vector每行内存不连续,对缓存不友好;若需高性能(如图像处理),得换方案
用 new 分配二维数组时必须分两步
直接 int** arr = new int[rows][cols] 是非法语法 —— C++ 不支持运行时确定大小的多维 new 表达式。
- 正确方式:先分配指针数组,再逐行分配:
int** arr = new int*[rows];for (int i = 0; i - 必须手动释放:先
delete[]每行,再delete[] arr,顺序反了会崩溃 - 常见错误:
delete[] arr[0]后继续访问arr[1],或漏掉某一行的delete[]
用一维数组模拟二维布局更高效
当行列固定或性能敏感(比如数值计算),用单块内存 + 手动索引比嵌套 vector 或指针数组快得多,且内存连续。
- 分配:
int* data = new int[rows * cols]{0}; - 访问
matrix[i][j]改成:data[i * cols + j] - 别忘了释放:
delete[] data; - 缺点:无法直接用
[i][j]语法,需要封装成类或用operator()才自然
初始化值和默认构造行为差异大
不同分配方式对“未显式初始化”的处理完全不同,容易导致读到垃圾值。
立即学习“C++免费学习笔记(深入)”;
-
new int[rows][cols]语法不存在,但若写成new int[rows * cols],不加{}就是未初始化;加{}(即new int[n]{})才零初始化 -
std::vector默认值取决于模板参数:内置类型如int默认为 0,自定义类型调用默认构造函数 -
std::vector<:vector>>(rows)</:vector>只构造了外层 vector,内层每个vector大小为 0 —— 访问matrix[i][j]会越界,必须先resize或push_back
C++ 里二维数组不是“一个东西”,而是多种实现策略的集合。选哪种,取决于你是否需要动态尺寸、是否在意缓存性能、能否承担手动内存管理风险——没想清楚这点,代码早晚会崩在某个边缘 case 上。











