码迷,mamicode.com
首页 > 其他好文 > 详细

(原)Vs中debug和release结果不一致

时间:2016-06-19 15:32:59      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

转载请注明出处:

http://www.cnblogs.com/darkknightzh/p/5598091.html

前两天调试程序,出现了一个很蛋疼的问题,debug和release结果不一致。网上很多都说是变量没有初始化,但是我这边变量已经初始化了。

最后仔细检查,找到了debug和release下代码结果不一致的地方。将该部分代码提取并简化,如下所示:

int MatrixPlusDiagVec(float* pMat, const float* pVec, int dim)
{
    for (int i = 0; i < dim; ++i)
    {
        pMat[i * (dim + 1)] += pVec[i];
    }
    return 0;
}

void ShowRowRes(const float* data, int len)
{
    for (int i = 0; i < len; ++i)
    {
        cout << i <<   << data[i] << endl;
    }
}

int main()
{
    int num = 250;
    float* pa = new float[num * num];
    memset(pa, 0, sizeof(float) * num * num);

    float* pb = new float[num * num];
    for (int i = 0; i < num; ++i)
    {
        pb[i] = (i + 1) * 5;
    }

    MatrixPlusDiagVec(pa, pb, num);

    ShowRowRes(pa, num);
    system("Pause");

    return 0;
}

其实是很简单的代码,就是将一个向量中的元素放到一个矩阵对角线上,但是debug和release结果就是不一致。调用ShowRowRes后,由于显示第一行结果,应该只有第一个元素非0,其他都是0。Debug下正常,release下前4个结果都不对。

Debug显示第一行结果如下:

技术分享

Release显示第一行结果如下:

技术分享

Release显示第二三四行均为0,显示第5行结果:

技术分享

  上述程序中float改为int后,release下结果依旧不正常。

 

后来将MatrixPlusDiagVec函数中

pMat[i * (dim + 1)] += pVec[i];

改为

pMat[i * (dim + 1)] = pMat[i * (dim + 1)] + pVec[i];

或者

pMat[i * dim + i] += pVec[i];

或者在pMat[i * (dim + 1)] += pVec[i];之后加上一句cout

或者使用vs2015编译程序,

结果都正确。无论如何也理解不了为啥。

由于不会看反汇编代码,所以就不看了。

 

之后有人看了我用的vs的版本,如下:

技术分享

建议更新到update5,更新了之后,也没有问题了。如下:

技术分享

因而,猜测原因应该是vs2013我用的那个版本的bug吧。

所以,如果程序无论如何也理解不了debug和release为啥结果不一致,那就。。。额,更新一下IDE吧。这个锅,只能IDE背了。

(原)Vs中debug和release结果不一致

标签:

原文地址:http://www.cnblogs.com/darkknightzh/p/5598091.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!