我正在使用调试器查看变量。在调试版本中,下面代码中的所有内容都按照我的预期显示,但是当我切换到发布版本时,我会得到奇怪的结果。为什么呢?
#include <iostream>
void say_hello(int argc, char* argv[])//In release mode argc has different values from 124353625 to 36369852 when viewed in the debugger
{
std::cout << "In say_hello()\n";
}
int main(int argc, char* argv[])
{
say_hello(3,argv);//when instead of literal I enter "argc" everything is ok.
return 0;
}
感谢您的帮助。
答案 0 :(得分:2)
由于您未在程序中使用这些参数,因此必须尝试在调试器中观察它们的值。但是,再次,因为你没有在你的程序中使用它们,编译器可以随意使用它们的值做任何事情。它可能会完全删除它们,当你要求每个参数的值时,调试器只会显示乱码。如果更改优化和调试信息设置,则可能会看到不同的结果。
答案 1 :(得分:2)
程序的结果在发布和调试模式下都是正确的。
当您在优化构建中查看调试器中的变量时,您不应期望它们保持“正确”值。在这种情况下,您的编译器已优化argc
和argv
的任何跟踪,因为它们未被使用。
答案 2 :(得分:0)
在Release版本中,代码已经过优化,许多值都保存在寄存器中。调试器不知道如何访问和显示这些值。
请参阅What does “Optimize Code” option really do in Visual Studio?