unique_ptr的奇怪错误

时间:2015-07-14 01:39:20

标签: c++ unique-ptr

我有朋友向我展示了代码,该代码在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]就可以更改发布版本中的程序行为。有谁知道为什么会这样?

0 个答案:

没有答案