11

私はVS2010を使用しています。デバッグ バージョンは正常に動作しますが、リリース バージョンはクラッシュし続けました。そのため、リリース バージョン モードでプロジェクトを右クリックし、[デバッグ] を選択してから、[新しいインスタンスの開始] を選択しました。この時点で、私がそのように宣言した配列が

int ma[4]= { 1,2,8,4};

初期化されることはありません。何が起こっているのかについての提案。

4

2 に答える 2

9

Release でビルドすると、コンパイラはコードに対して多くの最適化を実行します。最適化の多くには、変数をハードコードされた値に置き換えることが含まれます (可能で正しい場合)。たとえば、次のようなものがあるとします。

int n = 42;
cout << "The answer is: " << n;

オプティマイザが処理を完了する頃には、多くの場合、次のようになります。

cout << "The answer is: " <<  42;

...そして、変数nはプログラムから完全に削除されます。このプログラムのリリース バージョンをステップ実行して の値を調べようとすると、n非常に奇妙な値が表示されるか、デバッガーがnまったく存在しないと報告する場合があります。

最適化されたプログラムのデバッグを非常に困難にする適用可能な最適化は他にもたくさんあります。配列の初期化の後にブレークポイントを配置すると、配列が削除された場合、または配列の初期化が別の場所に移動された場合に、非常に誤解を招く情報が生成される可能性があります。

別の一般的な最適化は、次のように未使用の変数を削除することです。

int a = ma[0];

実際に を使用するコードがプログラムにない場合a、コンパイラはそれaが不要であることを認識し、存在しないように最適化します。

初期化された値を確認するためmaの最も簡単で信頼性の高い方法は、いわゆる sprintf デバッグを使用することです。

cout << "ma values: ";
copy (ma, ma+4, ostream_iterator <int> (cout, ", "));

そして、実際にそこにあるものを見てください。

于 2013-06-25T14:46:14.467 に答える
8

リリース ビルドをデバッグすると、デバッガーは偽の値を報告するか、ほとんどの変数の値を表示できなくなります。変数の値がリリース ビルドに含まれていることを確認する最も安全な方法は、ログを使用することです。

したがって、配列はデバッグ ビルドと同様にリリースで初期化される可能性がありますが、デバッガーからはそれを確認できません。リリースでコードがクラッシュする原因となっている他の問題があるようです。他の初期化されていない変数、またはスタックの破損/範囲外アクセスのインデックスを探します。

于 2013-06-25T14:37:47.453 に答える