Mis*_*tyD 8 c++ visual-studio-2010
我正在使用VS2010.我的调试版本工作正常,但我的发行版本仍然崩溃.所以在发布版本模式中我右键单击项目选择Debug然后选择启动新实例.此时我看到了一个我声明过的数组
int ma[4]= { 1,2,8,4};
Run Code Online (Sandbox Code Playgroud)
永远不会被初始化.关于可能发生的事情的任何建议.
如果您调试发布版本,调试器将报告虚假值,或者无法显示大多数变量的任何值.检查变量值是否在Release版本中的最安全方法是使用日志记录.
所以很可能你的数组在Release中初始化就像在Debug版本中一样,但是你无法通过调试器看到它.看来你有一些其他问题导致代码在Release中崩溃.寻找一些其他未初始化的变量或一些堆栈损坏/索引超出范围的访问.
在Release中构建时,编译器会对您的代码执行许多优化.许多优化包括用可能和正确的方法替换带有硬编码值的变量.例如,如果你有类似的东西:
int n = 42;
cout << "The answer is: " << n;
Run Code Online (Sandbox Code Playgroud)
当优化器完成它时,它通常看起来更像:
cout << "The answer is: " << 42;
Run Code Online (Sandbox Code Playgroud)
...并且变量n
完全从程序中删除.如果您正在逐步执行此程序的发行版并尝试检查其值n
,您可能会看到非常奇怪的值,或者调试器可能会报告n
根本不存在的值.
还有许多其他优化可以应用,这使得调试优化程序非常困难.在数组初始化之后放置断点可能会产生非常误导性的信息,如果数组被删除,或者它的初始化被移动到其他地方.
另一个常见的优化是消除未使用的变量,例如:
int a = ma[0];
Run Code Online (Sandbox Code Playgroud)
如果程序中没有实际使用的代码a
,编译器将看到a
不需要的代码,并将其优化掉以使其不再存在.
为了查看ma
已初始化的值,最简单的可靠方法是使用所谓的sprintf调试:
cout << "ma values: ";
copy (ma, ma+4, ostream_iterator <int> (cout, ", "));
Run Code Online (Sandbox Code Playgroud)
看看实际上到底是什么.
归档时间: |
|
查看次数: |
15281 次 |
最近记录: |