C++ 是否自动将整数初始化为零?

Does C++ initialize integers to zero automatically?

我注意到几个 'Uninitialized scalar variable' 类型的 Coverity(静态分析工具)错误影响很大。其中很多只是没有被初始化的整数。

将它们初始化为零与 C++ 默认情况下的做法有什么不同吗?

Does C++ initialize integers to zero automatically?

对于自动变量:

有些编译器可能会这样做,但标准并不要求这样做。符合规范的实现可能会使它们成为未初始化的垃圾值。

对于static个变量:

除非明确初始化,否则必须将它们初始化为零。

是也不是。

这取决于它们是如何声明的。如果它们被声明为 static,那么是的,它们保证被零初始化。但是,函数中的局部变量可能不会被零初始化。在大多数情况下 class 成员变量也不是(static 除外)。

基本上,如果它不是 static,你应该假设它不会被初始化为 0。因为它没有被初始化,它可以有任何值。

默认情况下,C++ 不会将整型变量初始化为零。

在调试模式下编译项目时,一些编译器可能会将它们清零或填充一些默认值。在通常不会发生的发布模式下。

静态变量有一个例外,但默认情况下可以安全地假设任何未初始化的东西都包含一个随机值。

注意未初始化的变量。找到这种错误很困难,而且会浪费很多时间。常见症状:程序在debug模式下运行良好,但在release模式下表现异常。

在静态存储持续时间内声明的对象在任何其他初始化(包括默认初始化)发生之前被零初始化。

To default-initialize an object of type T means:
— if T is a (possibly cv-qualified) class type (Clause 9), the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);
— if T is an array type, each element is default-initialized;
— otherwise, no initialization is performed
C.11 §8.5¶6

Note: Every object of static storage duration is zero-initialized at program startup before any other initialization takes place. In some cases, additional initialization is done later. — end note ]
C.11 §8.5¶9

errors of type 'Uninitialized scalar variable' that are high impact

是的,它们影响很大,因为未初始化的自动变量具有不确定的值,并且 using an indeterminate value is undefined behavior 因此如果您在初始化之前尝试从它们生成值,这些是严重的错误。

Would initializing them to zero be any different than what C++ does by default?

是的,对于自动标量变量,C++ 标准表示它们将具有不确定的值,来自第 8.5 [dcl.init] 部分的 C++ 标准草案:

If no initializer is specified for an object, the object is default-initialized. When storage for an object with automatic or dynamic storage duration is obtained, the object has an indeterminate value, and if no initialization is performed for the object, that object retains an indeterminate value until that value is replaced (5.17 [expr.ass])

编译器可以在调试模式下初始化局部变量,以帮助调试,我们可以看到MSVC can do this using /RTC:

Initialization of local variables to a nonzero value. This helps identify bugs that do not appear when running in debug mode.[...]