在开发 32 位 Windows 命令行程序时,我们最近遇到了这样一种情况:调试版本按预期工作,而发布版本在其计算中显示出不应该出现的奇怪行为。现在,这在 20 多年前并不是一个罕见的问题。对于发布版本,编译器优化被打开,即使现在编译器优化也不一定适用于所有情况。所以,在过去,如果我们遇到这个问题,我们会关闭编译器优化——如果速度或空间考虑真的很重要,可能有选择地关闭。这次我们关闭了所有优化,问题依然存在!调试版本和发布版本之间的唯一区别在于一系列编译器和加载程序设置。我们返回并尽可能地更改发布设置以匹配调试设置,但问题仍然存在!我们以前从未见过。
这一切都是在VC6平台上进行的,我们一般都是在32位Windows上使用的。也就是Microsoft Visual C++ 6.0。我们对 VC6 的偏好是因为我们是 Microsoft 的所有版本的 C/C++ 包的 beta 测试员,直到 VC6,并且在优化器的调试中非常活跃。但由于我们在使用 VC8 时没有遇到真正的问题,所以我们尝试了这一点。在这种情况下,我们只是让 VC8 转换我们一直在使用的项目。令我们惊讶的是,我发现 VC8 显示了完全相同的问题。调试版本有效,发行版本无效。我们可能会尝试在 VC8 中从头开始创建这个东西,看看是否会有所不同,但我们宁愿怀疑它不会。在这一点上,我们根本不明白这一点。它必须是我们缺少的某个地方的编译器开关设置。或者是吗?
还有什么可以导致发布版本和调试版本之间的差异?
最佳答案
通常,您会发现调试可执行文件与发布可执行文件在几个方面有所不同。仅通过查看可执行文件的文件大小就可以看出这一点。可能的原因包括
- 调试可能会编译额外的代码来进行错误检查
- Debug 一般禁用优化,而 Release 可能有较高级别。
- Debug 可能默认将自动变量初始化为零,而 Release 根本不初始化。
- Debug 可能携带附加信息以将可执行代码与源代码相关联,而 Release 则不会。
我最好的建议是初始化所有变量,即使这看起来很愚蠢。验证您的所有内存分配是否有效,以及您是否在范围内正确释放。
上面的静态分析器评论是极好的建议。您可以通过使用更新的编译器进行编译来获得类似的好处。
看看 CPPCHECK,或众多商业检查器之一。
无论如何,我建议您升级到最新的编译器。
祝你好运。
邪恶。
关于c++ - MS Visual C++ 发布版和调试版之间行为不同的可能原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43522381/