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

转载请注明出处:

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背了。

时间: 2024-10-20 10:45:04

(原)Vs中debug和release结果不一致的相关文章

Visual Studio中Debug和Release的区别

在Visual Studio中,生成应用程序的时候有2种模式:Debug和Release.两者之间如何取舍呢? 假设有这么简单的一段代码,在主程序中调用方法M1,M1方法调用M2方法,M2方法调用M3方法,M3方法中抛出异常. class Program { static void Main(string[] args) { M1(); Console.ReadKey(); } static void M1() { M2(); } static void M2() { M3(); } stati

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

Visual Studio中Debug与Release的区别: 在Visual Studio中,编译模式有2种:Debug与Release.这也是默认的两种方式,在新建一个project的时候,就已经存在这两种模式供选择. Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.      Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用. SO:      一般都是用Release来打包发布程序,因为Re

VS中 Debug和Release版本的区别

VS Debug和Release版本的区别 1. 变量.大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋值近似于随机(我想是直接从内存中分配的,没有初始化过).这样就明确了,如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将导致流程导向不一致:用作数组下标将会使程序崩溃:更加可能是造成其他变量的不准确而引起其他的错误.所以在声明变量后马上对其初始化一个默认的值是最简单有效的办法

CMAKE设置VS工程中Debug和Release不同的输出名称

CMAKE在管理工程时,需要同时编译Debug和Release版本,但是两个版本输出的文件无论是lib还是dll,名称都是是完全相同. 如果要输出在同一个目录中是非常麻烦的,非常容易混淆,可以使用以下命令设置debug和Release输出文件后缀的方式进行区分: if(WIN32 AND NOT MINGW) if(NOT DEFINED CMAKE_DEBUG_POSTFIX) set(CMAKE_DEBUG_POSTFIX "_debug") endif() if(NOT DEFI

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

当编译和执行一个工程时,可以在Debug和Release两种配置下执行. Debug模式用于调试程序,这是个受保护的运行环境,它将告诉你程序是否有泄露,在运行时也能对特定函数的结果进行检查.然而它生成的可执行文件运行较慢.因此当你的应用经过测试准备投入使用时,你应该在Release模式下进行编译,这将生成供最终用户使用的可执行文件.简单的说就是Debug下可以进行调试,查bug,改错,且运行较慢. 虽然Release下也可以打断点,但是有时候有些变量的值在Release下是看不见的.调试的话应该

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

The possible properties and their default values are: debuggable:表示是否可以在手机上调试程序. 在Eclipse中,只有android:debuggable="true"时我们才可以在手机上调试Android程序. 但是当我们没在AndroidManifest.xml中设置其debug属性时: 使用Eclipse运行这种方式打包时其debug属性为true,使用Eclipse导出这种方式打包时其debug属性为法fals

VC++2010 中Debug和Release配置

刚刚遇到了Release模式正常运行,而直接切换到Debug报错的问题,后来发现是Debug模式和Release模式配置不同造成的,再此记录一下解决方法: 1.项目属性->切换到Release模式->C/C++->常规->附加包含目录,拷贝文本到Debug模式下 2.项目属性->切换到Release模式->链接器->常规->附加库目录,—————————— 3.—————————————->链接器->输入->附加库依赖,——————————

VS下 debug与release运行结果不一致

网罗了大量文章,主要说变量未初始化的较多,代码量较大,着实不好搞,依次排查,但凡涉及的都已经初始化,无果... eggs hurt~~~持续~~~ 最后初步敲定嫌疑:PI的问题,每次用到介个全局变量的时候就报错,把代码中PI用3.1415926****代替,无果... eggs hurt~~~持续~~~ NNGX,PI的定义在.h头文件里,最后挪到.cpp里好了,有中踏空感~擦一下~Mark一下~ 网罗的大量文章里面推荐一篇,(貌似这哥们儿也是转的,呃...不深究了) 地址:http://blo

VS中生成、清理项目、调试、开始执行(不调试)、Debug 和 Release等之间的区别

一.生成和重新生成 "生成"的时候只对你改动过的文件重新生成没有改动过的文件不会重新生成: "重新生成"是对所有的文件都重新生成. 以cpp为例当你只改动某些.cpp之类的文件的时候可以用生成省了编译没有改动的那些些文件的时间:但是改动了某些.h之类的文件最好用重新生成,因为有可能能有些文件包含.h文件也需要重新编译 选择生成或生成解决方案,将只编译自上次生成以来更改过的那些些项目文件和组件 注意 如果解决方案中包括多个项目,则生成命令将变成生成解决方案. 选择重新