首页 > 编程语言 >C++程序在debug结果正确但release结果错误或两个模式下结果不同

C++程序在debug结果正确但release结果错误或两个模式下结果不同

时间:2023-10-12 22:57:19浏览次数:36  
标签:初始化 计算错误 结果 C++ debug 调试信息 release

  今天在运行release工程时发现运行结果出现了-1.#IND00, 1.#INF00 。但是在debug下可以计算出数字。于是在网上查找资料。

  • 尝试修改配置属性优化方法为已禁用。未果
  • 尝试修改调试信息格式。未果
  • 尝试修改代码生成运行库。未果

  原因: 最后通过输出变量仔细对比发现是某个函数中的输入参数是一个结构体,而结构体内包含了多个数组,其中有些数组没有被我进行初始化导致的计算错误。

  分析: 由于debug模式下保留调试信息并通常自动将结构体内未初始化的变量初始化为0,所以在debug模式下未完全初始化一个结构体通常并不会引起计算问题,除非本来不想让它为0,但忘了初始化才会计算错误,恰巧想让它为0但忘了初始化在某些情况下不会报错。

  但是release模式进行了内部的代码优化,使速度最大化,这其中并不会自动初始化结构体内数组。当使用它的时候会变成一个巨大的数,最终导致计算错误,但是编译的时候也不会报错。

  结论: 这种情况90%是由于输入的参数包含的某些数组未初始化导致,9.99%是调用的库的配置属性(优化策略、运行库、调试信息格式)不一致导致,0.01%是编译器出了问题,换一个编译器可能可以解决,概率很小。应当优先考虑上述两情况。

标签:初始化,计算错误,结果,C++,debug,调试信息,release
From: https://www.cnblogs.com/hhddd-1024/p/17760804.html

相关文章

  • C++声明、定义、初始化
    声明声明可声明多次,而编译器不会为其分配存储空间。目的是为了使编译器知道该标识符所代表的含义及原型所在,文件与文件之间使用关键字extern修饰变量或函数称为声明(引用)可使同工程目录下的变量或函数实现交互说明符+表达式列表定义一般的情况下,把建立空间的声明......
  • C++内置函数用法
    1-substr函数(字符截取函数)格式1:substr(stringstring,inta,intb)string是需要截取的字符串;a是截取字符串的开始位置;(注:当a=0或1时,都是从第一位开始截取)b是要截取字符串的长度;格式2:substr(stringstring,inta)string是需要截取的字符串;a可以理解为第a个字符开始截取后面所有......
  • 关于如何解决visualc++6.0打开文件闪退的一种方式(附带解决输入法无法显示)
    这里我把VisualC++6.0安装程序和filetool分享在我的网盘里面了网盘下载QAQ链接:https://pan.baidu.com/s/1azSMX_cOKgb64WT7-gTdbQ?pwd=ayxs提取码:ayxs 下载后解压文件,运行filetool.exe 进入Visualc++6.0,我们要运行并打开这个filetool里的工作空间  然后单击工......
  • c++中的继承(上)
    继承的定义继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设......
  • C++ 11 auto关键字
    https://www.cnblogs.com/DswCnblog/p/5629048.html熟悉脚本语言的人都知道,很多脚本语言都引入了“类型自动推断”技术:比如Python,可以直接声明变量,在运行时进行类型检查。随着C++11标准的发布,C++语言也引入了类型自动推断的功能,这就是我们今天要介绍的auto关键字。C++是一种强......
  • Code-C++-chrono to tm (format time)
    Code-C++-chronototm(formattime)std::chrono::system_clock::time_pointnow=std::chrono::system_clock::now(); std::time_tnow_time_t=std::chrono::system_clock::to_time_t(now); std::tm*now_tm=std::localtime(&now_time_t); charbuffer[128......
  • Code-C++-Snowflake
    Code-C++-Snowflake#include<iostream>#include<chrono>#include<stdexcept>classSnowflake{private://雪花算法的各个参数staticconstexprint64_tworkerIdBits=5;staticconstexprint64_tdatacenterIdBits=5;staticcons......
  • C++ 11 Lambda表达式
    C++11Lambda表达式 C++11的一大亮点就是引入了Lambda表达式。利用Lambda表达式,可以方便的定义和创建匿名函数。对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多高级语言在很早以前就已经提供了Lambda表达式的功能,如C#,Python等......
  • 开发者笔记 C++11新特性并发编程future
    上一篇介绍了<thread>文件里线程相关类,这篇将介绍C++<future>头文件里线程类,future里包含的类主要是处理异步任务,线程函数封装,线程间通信,同步,捕捉异常处理https://zhuanlan.zhihu.com/p/509118687future的引入c++11引入的future是为了解决异步通信问题的。future可以看做是数......
  • C++11新特性之基本范围的For循环(range-based-for)
    C++11新特性之基本范围的For循环(range-based-for)最新推荐文章于 2023-07-2219:30:58 发布Rayen0715于2017-01-0713:49:35发布49588收藏174版权Range-Based-For熟悉C++98/......