【发布时间】:2012-12-23 09:17:43
【问题描述】:
struct Line
{
Bounds bounds_;
Vector origin_;
uint32_t begin_;
uint32_t end_;
dist ascent_;
dist descent_;
};
具体用法如下:
Line line = {};
while (!parser.done()) {
line = Line(); // zero-initialize
...
}
Bounds 和 Vector 是非 POD 类,dist 是 int64_t 的 typedef。
但是,VC++11 的一个优化的 32 位版本似乎至少在 while 循环中留下了部分 line 未初始化。为什么?按照Do the parentheses after the type name make a difference with new?的说法,应该是零初始化了吧?
我将结构成员的值记录到文件中:
-
Line line = {};之后:非POD类型默认初始化,其他为0。 -
line = Line();之后:POD 类型仍默认初始化,其他包含随机值。
【问题讨论】:
-
您对此有何看法?通过正常运行程序并在代码中进行测试,还是在调试器中查看?
-
@chris:是值初始化,我认为在这种情况下相当于零初始化。
-
@R.MartinhoFernandes:通过将值写入日志文件。在调试器下运行时,用于变量的内存位置恰好被清零,因此不可见。
-
@Nawaz,哦,我一定很困惑。出于某种原因,我认为
Line()会默认初始化它,而那些已初始化的将在分配给一个时初始化。
标签: c++ visual-c++ initialization compiler-bug