我注意到了几种类型'未初始化标量变量'的覆盖率(静态分析工具)错误。这是很有影响力的。其中很多只是不能初始化的整数。
将它们初始化为零与默认情况下C ++的作用有什么不同?
答案 0 :(得分:10)
C ++会自动将整数初始化为零吗?
对于自动变量:
有些编译器可能会这样做,但标准并不要求它。符合标准的实现可能会使它们成为未初始化的垃圾值。
对于static
变量:
除非另有明确初始化,否则必须将它们初始化为零。
答案 1 :(得分:7)
默认情况下,C ++不会将整数变量初始化为零。
在调试模式下编译项目时,某些编译器可能将它们清零或填充一些默认值 。在发布模式下,通常不会发生。
静态变量有一个例外,但默认情况下可以安全地假设任何unitialized都包含一个随机值。
注意未初始化的变量。发现这种错误很难,可能会浪费很多时间。常见症状:程序在调试模式下工作正常,但在发布时行为异常。
答案 2 :(得分:1)
在静态存储持续时间内声明的对象在进行任何其他初始化之前初始化为零(包括默认初始化)。
默认初始化
T
类型的对象意味着:
- 如果T
是(可能是cv限定的)类类型(第9条),则调用T
的默认构造函数(并且 如果T
没有可访问的默认构造函数,则初始化是不正确的;) - 如果T
是数组类型,则每个元素都是默认初始化的;
- 否则,不执行初始化
C.11§8.5¶6[注意:在任何其他初始化之前,每个静态存储持续时间的对象在程序启动时都是零初始化的 发生了。在某些情况下,稍后会进行额外的初始化。 - 结束记录]
C.11§8.5¶9
答案 3 :(得分:0)
是和否。
这取决于他们如何宣布。如果它们被声明为static
,那么是的,它们被保证为零初始化。但是,函数中的局部变量可能不是零初始化的。在大多数情况下,类成员变量也不是(例外static
)。
基本上,如果它不是static
,你应该假设它不会被初始化为0.由于它没有被初始化,它可以有任何价值。
答案 4 :(得分:0)
具有高影响力的“未初始化标量变量”类型的错误
是的,它们影响很大,因为未初始化的自动变量具有不确定的值和using an indeterminate value is undefined behavior所以如果您在初始化之前尝试从它们生成值,这些都是严重的错误。
将它们初始化为零与默认情况下C ++的作用有什么不同?
是的,对于自动标量变量,C ++标准表示它们具有不确定的值,来自8.5
[dcl.init] 部分的草案C ++标准:
如果没有为对象指定初始化程序,则该对象为 默认初始化。使用自动或自动存储对象时 获得动态存储持续时间,该对象具有不确定性 值,如果没有为对象执行初始化,那么 对象保留不确定的值,直到替换该值 (5.17 [expr.ass])
编译器可能在调试模式下初始化局部变量,为了帮助调试,我们可以看到MSVC can do this using /RTC:
将局部变量初始化为非零值。这有帮助 识别在调试模式下运行时未出现的错误。[...]