大括号初始化内置数组最安全:{}自动补零,{42}仅首元素为42其余为0,未初始化则值未定义;std::array需显式指定大小且支持聚合初始化;new[]须加()才初始化为0;vector更灵活但非数组。

初始化内置数组时,大括号初始化最安全
直接用 {} 初始化内置数组(如 int arr[5] = {1, 2, 3};)能自动补零,避免未定义值。省略部分元素时,剩余位置会被隐式初始化为 0(对 int、double 等而言),这点常被忽略。
- 如果写成
int arr[5] = {};,全部 5 个元素都是 0 - 如果写成
int arr[5] = {42};,只有arr[0]是 42,其余是 0 - 但若用
int arr[5];不加初始化,内容是随机栈值——读取前使用会触发未定义行为 - C++20 起支持
std::array的聚合初始化,语义更一致,推荐替代裸数组
std::array 初始化必须显式指定大小
std::array 是模板类,编译期固定大小,声明时必须给出尺寸,且初始化方式和裸数组不同:不能靠推导省略模板参数。
- 正确写法:
std::array<int> a = {1, 2, 3};</int>或std::array<int> a{1, 2, 3};</int> - 错误写法:
std::array<int> a = {1, 2, 3};</int>—— 编译失败,缺少长度模板参数 - 不能用
std::array<int> a{};</int>来“清零”所有元素?可以,但效果等同于{0, 0, 0},因为默认构造即值初始化 - 如果用
std::array存放自定义类型,确保该类型支持聚合初始化或有合适的构造函数
动态数组 new[] 初始化容易漏掉括号
用 new int[N] 分配的数组,元素不会自动初始化;想全为 0,必须加空括号 (),否则全是垃圾值。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
int* p = new int[10];→ 未初始化,读取任意元素都危险 -
int* p = new int[10]();→ 所有元素值初始化为 0(注意括号不能省) -
int* p = new int[10]{1, 2};→ C++11 起支持,前两个为 1/2,其余为 0 - 别忘了配对
delete[] p;,漏掉或错用delete会导致未定义行为
vector 初始化更灵活但不是数组
很多人想“初始化数组”实际是要可变长容器,std::vector 更合适,但要注意它不等于数组——没有编译期大小、不保证连续内存(其实保证,但语义不同)。
立即学习“C++免费学习笔记(深入)”;
-
std::vector<int> v(5);</int>→ 5 个 0 -
std::vector<int> v(5, 42);</int>→ 5 个 42 -
std::vector<int> v{1, 2, 3};</int>→ 初始化列表,size=3 - 不要用
vector模拟 C 风格数组传参场景(比如需要int*和长度),此时应优先考虑std::span(C++20)或明确传递指针+长度
裸数组的初始化规则看似简单,但括号有无、位置、是否带类型,差一个字符就可能从安全变成未定义行为。尤其在跨平台或优化级别高的构建中,未初始化数组的 bug 很难复现。

















