转载请注明出处:

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

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

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

 int MatrixPlusDiagVec(float* pMat, const float* pVec, int dim)
{
for (int i = ; i < dim; ++i)
{
pMat[i * (dim + )] += pVec[i];
}
return ;
} void ShowRowRes(const float* data, int len)
{
for (int i = ; i < len; ++i)
{
cout << i << ' ' << data[i] << endl;
}
} int main()
{
int num = ;
float* pa = new float[num * num];
memset(pa, , sizeof(float) * num * num); float* pb = new float[num * num];
for (int i = ; i < num; ++i)
{
pb[i] = (i + ) * ;
} MatrixPlusDiagVec(pa, pb, num); ShowRowRes(pa, num); delete[] pa;
delete[] pb; system("Pause"); return ;
}

其实是很简单的代码,就是将一个向量中的元素放到一个矩阵对角线上,但是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结果不一致的更多相关文章

  1. C++中debug和release的区别 . 转载

    vc中debug和release的不同 收藏  在使用VC开发软件的过程中,正当要享受那种兴奋的时候突然发现:release与debug运行结果不一致,甚至出错,而release又不方便调试,真的是当 ...

  2. vs中debug和release的区别你知道吗

    在Visual Studio中,生成应用程序的时候有2种模式:Debug和Release.两者之间如何取舍呢? 一.vs中debug和release的区别 1.Debug 通常称为调试版本,它包含调试 ...

  3. Visual Studio中Debug与Release以及x86、x64、Any CPU的区别

    Visual Studio中Debug与Release的区别: 在Visual Studio中,编译模式有2种:Debug与Release.这也是默认的两种方式,在新建一个project的时候,就已经 ...

  4. Visual Studio中Debug与Release以及x86、x64、Any CPU的区别 &&&& VS中Debug与Release、_WIN32与_WIN64的区别

    本以为这些无关紧要的 Debug与Release以及x86.x64.Any CPU 差点搞死人了. 看了以下博文才后怕,难怪我切换了一下模式,程序就pass了.... 转载: 1.https://ww ...

  5. vs中debug和release版本的区别(转)

    vs中的程序有debug和release两个版本,Debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发 人员提供强大的应用程序调试能力.而Rel ...

  6. VS中Debug与Release、_WIN32与_WIN64的区别

    一.Debug与Release 1.  区别 Debug——调试版,生成的.exe中包含很多调试信息,若直接发包,比较大: Release——发布版 2.  如何区分是Debug编译还是Release ...

  7. Visual Studio中Debug和Release的区别

    在Visual Studio中,生成应用程序的时候有2种模式:Debug和Release.两者之间如何取舍呢? 假设有这么简单的一段代码,在主程序中调用方法M1,M1方法调用M2方法,M2方法调用M3 ...

  8. VS系列软件中debug和release编译环境有什么区别

    当编译和执行一个工程时,可以在Debug和Release两种配置下执行. Debug模式用于调试程序,这是个受保护的运行环境,它将告诉你程序是否有泄露,在运行时也能对特定函数的结果进行检查.然而它生成 ...

  9. Android Studio中debug和release模式默认的参数配置

    The possible properties and their default values are: debuggable:表示是否可以在手机上调试程序. 在Eclipse中,只有android ...

随机推荐

  1. CI框架uri去掉index.php

    CI框架的入口是index.php,所以url实际上要多出一个index.php,非常不美观.我使用的是apache服务器,要开启mod_rewrite服务才可以. sudo a2enmod rewr ...

  2. Oracle 10g体系结构及安全管理

    (1)               Oracle数据库服务器:数据库,实例 (2)               数据库:(1)物理存储—数据文件,控制文件,日志文件,(2)逻辑存储—表空间,段,区间, ...

  3. MySQL错误Another MySQL daemon already running with the same unix socket

    今天遇到RT这个问题后,导致数据库错误,然后在国外网站发现了一个解决方法,记录如下: 原因是:多个Mysql进程使用了同一个socket. 解决方法是:直接把mysql.sock文件改名即可.也可以删 ...

  4. nginx 504 Gateway Time-out错误解决办法

    我们经常会发现大量的nginx服务器访问时会提示nginx 504 Gateway Time-out错误了,下面我来总结了一些解决办法,有需要了解的同学可进入参考. 一般看来, 这种情况可能是由于ng ...

  5. 简单的CSS 下拉导航菜单实现代码

    <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> <head> <met ...

  6. VLSI和ASIC的区别(转)

    VLSI和ASIC是不同的两个概念 VLSI(Very Large Scale Integrate circuit)是指集成电路的规模,有时也指制造集成电路所使用的工艺,VLSI工艺一般都在1um以下 ...

  7. Effective Java提升Code Coverage代码涵盖率 - 就是爱Java

    虽然我们已经有了测试程序,但是如何得知是否已完整测试了主程序?,透过Code Coverage代码涵盖率,我们可以快速地得知,目前系统中,有多少程序中被测试过,不考虑成本跟投资效益比,涵盖率越高,代表 ...

  8. Codeforces 358D Dima and Hares

    http://codeforces.com/contest/358/problem/D 题意:给出n个数,每个数取走的贡献与相邻的数有关,如果取这个数的时候,左右的数都还没被取,那么权值为a,如果左右 ...

  9. kibana 访问IP分布图

  10. 【转】ARM Linux 3.x的设备树(Device Tree)

    原文网址:http://blog.csdn.net/21cnbao/article/details/8457546 1.    ARM Device Tree起源 Linus Torvalds在201 ...