动态创建的对象在使用前应被初始化
8.10 ID_dynamicInitialization
通过 malloc、new 等方式动态创建的对象在初始化前具有不确定的值,读取未初始化的对象会导致标准未定义的行为。
示例:
int* a = new int[2];
use(a[0] + a[1]); // Non-compliant
struct A {
int x, y;
};
A* b = new A;
use(b->x * b->y); // Non-compliant
建议在创建处初始化:
int* a = new int[2](); // Zero-initialization, all elements are 0
A* b = new A(); // Zero-initialization, all members are 0
new 表达式结尾的空括号表示将元素或成员初始化为 0,对于类类型,如果存在自定义默认构造函数,则会调用默认构造函数进行初始化。
也可以使用列表初始化指定元素或成员的值:
int* a = new int[2]{1, 2}; // List-initialization
A* b = new A{3, 4}; // List-initialization
数组的两个元素分别为 1 和 2,A 对象的两个成员分别为 3 和 4。
相关
依据
ISO/IEC 14882:2003 5.3.4(15)
ISO/IEC 14882:2011 5.3.4(15)