我有朋友向我展示了代码,该代码在VS2012中的发布或调试配置中提供了不同的结果。没有多线程,所以我开始对这种情况感兴趣。归结为:一个班级有成员
std::unique_ptr<double[]> m_OldRo;
在for循环中我们做:
if(m_OldRo[i] < ro_min)
ro_min = m_OldRo[i];
ro_min定义为double,初始值为10000。 在Debug中,ro_min总是等于9.999997e-001。在版本中,ro_min等于-3.818927e + 005。事情变得非常奇怪:
1)如果在if语句之前添加此类代码,则结果将更改为normal:
double doubleValue = 0;
for(size_t k = 0; k < m_Triangles; ++k)
{
doubleValue = m_OldRo[k];
std::cout << "doubleValue = " << doubleValue << "\n";
}
结果:
doubleValue = 1.000000e+000
doubleValue = 1.000000e+000
doubleValue = 9.999997e-001
doubleValue = 1.000000e+000
doubleValue = 1.000000e+000
doubleValue = 1.000000e+000
doubleValue = 9.999999e-001
doubleValue = 1.000000e+000
doubleValue = 1.000030e+000
doubleValue = 1.000030e+000
ro_min = 9.999997e-001
2)如果您还添加此代码,结果会更改为错误:
double doubleSum = 0;
for(size_t k = 0; k < m_Triangles; ++k)
{
doubleSum += m_OldRo[k];
std::cout << "doubleSum = " << doubleSum << "\n";
}
结果:
doubleValue = 1.000000e+000
doubleValue = -3.818927e+005
doubleValue = 9.999997e-001
doubleValue = 3.818947e+005
doubleValue = 1.000000e+000
doubleValue = 1.000000e+000
doubleValue = 9.999999e-001
doubleValue = 1.000000e+000
doubleValue = 1.000030e+000
doubleValue = 1.000030e+000
doubleSum = 1.000000e+000
doubleSum = -3.818917e+005
doubleSum = -3.818907e+005
doubleSum = 4.000000e+000
doubleSum = 5.000000e+000
doubleSum = 6.000000e+000
doubleSum = 7.000000e+000
doubleSum = 8.000000e+000
doubleSum = 9.000030e+000
doubleSum = 1.000006e+001
ro_min = -3.818927e+005
打印只是为了解释,只需添加或赋值m_OldRo [k]就可以更改发布版本中的程序行为。有谁知道为什么会这样?