C++程序在debug结果正确但release结果错误或两个模式下结果不同
今天在运行release
工程时发现运行结果出现了-1.#IND00, 1.#INF00
。但是在debug
下可以计算出数字。于是在网上查找资料。
- 尝试修改配置属性优化方法为已禁用。未果
- 尝试了修改调试信息格式
Zi
。未果 - 尝试修改代码生成运行库。未果
原因: 最后通过输出变量仔细对比发现是某个函数中的输入参数是一个结构体,而结构体内包含了多个数组,其中有些数组没有被我进行初始化导致的计算错误。
分析: 由于debug
模式下保留调试信息并通常自动将结构体内未初始化的变量初始化为0,所以在debug
模式下未完全初始化一个结构体通常并不会引起计算问题,除非本来不想让它为0
,但忘了初始化才会计算错误,恰巧想让它为0
但忘了初始化在某些情况下不会报错。
但是release
模式进行了内部的代码优化,使速度最大化,这其中并不会自动初始化结构体内数组。当使用它的时候会变成一个巨大的数,最终导致计算错误,但是编译的时候也不会报错。
结论: 这种情况90%
是由于输入的参数包含的某些数组未初始化导致,9.99%
是调用的库的配置属性(优化策略、运行库、调试信息格式)不一致导致,0.01%
是编译器出了问题,换一个编译器可能可以解决,概率很小。应当优先考虑上述两情况。
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2021-10-12 ExpiringMap用法详解