C++ 只发布了一个Bug

C++ 只发布了一个Bug,c++,optimization,compiler-construction,release,visual-studio-2013,C++,Optimization,Compiler Construction,Release,Visual Studio 2013,我正在使用Microsoft Visual Studio Express 2013。我有3个项目的解决方案。1个静态库和两个引用该库的项目。当的优化只库设置为/O2时,我在游戏中遇到了一些奇怪的bug。当我仅为库禁用优化时,它的运行方式与调试时完全相同。什么会导致这种情况?我如何修复它?您可以使用未初始化的变量,这些变量在调试模式下由编译器自动初始化,而不是在发布模式下 此外,您可能会面临对齐问题和较小的内存溢出,在调试模式下,由于没有优化,您会受到保护,但当启用优化且代码以不同方式对齐时,这可

我正在使用Microsoft Visual Studio Express 2013。我有3个项目的解决方案。1个静态库和两个引用该库的项目。当的优化只库设置为/O2时,我在游戏中遇到了一些奇怪的bug。当我仅为库禁用优化时,它的运行方式与调试时完全相同。什么会导致这种情况?我如何修复它?

您可以使用未初始化的变量,这些变量在调试模式下由编译器自动初始化,而不是在发布模式下

此外,您可能会面临对齐问题和较小的内存溢出,在调试模式下,由于没有优化,您会受到保护,但当启用优化且代码以不同方式对齐时,这可能会导致问题和未定义的行为

尝试确保所有变量都已显式初始化,并且假设:

int i;
is the same as int i = 0;

请提供更多细节。你到底有什么行为?你能找出导致问题的部分代码吗(请提供)是的,请提供更多详细信息。有错误消息吗?我所有的代码都在这里发生的是,它不会抛出任何致命错误。它实际上运行,但问题是它的结果与调试时完全不同。生成之间的行为差异通常是由于未初始化的数据造成的。混合调试模块和发布模块意味着您将获得不同的堆和内存分配器。由一个模块分配并由另一个模块释放的内存将以各种有趣的方式失败。尝试与所有调试或所有版本保持一致。MSVC在检测调试生成中未初始化的局部变量使用方面做得很好(默认情况下,调试生成的
/RTC1
选项处于启用状态)。然而,检测率并不是100%。调试构建中未初始化的堆内存和本地变量都用确定性值填充,但这些值的设计通常会导致“快速故障”(而不是隐藏问题),如果在未被覆盖或释放后使用这些值。我认为假设编译器将某些值填充到未初始化的变量是非常危险的。静态分析工具通常会提出这一问题,因为这种行为可能在编译器、版本、操作系统等之间发生变化。。。在特定的情况下,如果他假设变量为0,并且它填充了其他内容,并且他有一个var>0的测试,那么它可能会工作一次,而不会工作另一次。MSVC实际上用预先确定的值填充动态分配的内存缓冲区,但它不会用未初始化的变量填充好的值。MSVC在调试模式下对未初始化的变量/内存所做的事情并不值得依赖-初始化的值被设计成会导致问题,从而暴露错误。
/RTC1
检查是否使用未初始化的局部变量不仅仅是用
0xCC
填充它们
/RTC1
实际上为初始化为
false
的每个本地变量保留一个隐藏标志,并在每次使用变量时初始化和检查变量时设置为
true
。如果使用变量时该标志仍然为false,那么它将调用一个函数,该函数将中断调试器或导致运行时失败消息。我想感谢大家。我检查了我的应用程序并修复了所有未初始化的变量。该程序现在在调试和发布中都能完美地工作。