让我们考虑以下简单程序:
int main()
{
int *a = new int;
}
*a
的值0
是否可靠?我确定不,因为原语没有默认初始化:
默认初始化T类型的对象意味着:
(7.1) - 如果T是(可能是cv认证的)类类型(第9条), 构造函数被考虑。适用的构造函数是 枚举(13.3.1.3),初始化器()的最佳值是 通过重载决议(13.3)选择。因此构造函数 使用空参数列表调用selected来初始化 对象
(7.2) - 如果T是数组类型,则每个元素都是默认初始化的。
(7.3) - 否则,不执行初始化。
我说*a
没有初始化,因此访问它会导致UB。这是对的吗?
答案 0 :(得分:7)
要绝对清楚,请考虑
int *a = new int;
int *b = new int();
*a
未初始化,*b
初始化为0.
在初始化之前使用*a
是未定义的行为。
答案 1 :(得分:4)
是
您可以使用int
对其进行值初始化(即将new int()
设置为零)。