VS 2005 で開発されたコマンド ライン プログラムがあります。これは、いくつかのファイルを処理し、出力ファイルを作成します。クラッシュの原因となる入力ファイルがありますが、それは場合によってのみです。プログラムがコマンド ラインを使用して開始された場合 (リリースまたはデバッグ ビルドが発行された場合)、そのファイルの処理中にクラッシュします。しかし、VS 2005 から F5 キー (デバッグ モード) を押して起動すると、問題なく動作し、クラッシュせず、結果も正しくなります。ヒントはありますか?ありがとう。
2 に答える
デバッグでは正常に動作するがリリースでは動作しない、またはあるシステムでは正常に動作するが別のシステムでは動作しない、または満月に 1 回だけ顕著な動作をトリガーするなど、さまざまな種類の未定義の動作が存在しますが、おそらくシングルスレッド コードの最も一般的な原因は初期化されていないメモリです。
ほとんどの場合、これは初期化されていない変数です。また、(ガベージでいっぱいのバッファーのように) 割り当てられているが満たされていないメモリ ブロックである可能性もありますが、コードはそれを想定しています。一部の一般的なコンパイラのデバッグ ビルドでは、新しく割り当てられたメモリがスタックまたはヒープ上でゼロになる傾向がありますが、リリース ビルドではこれが行われません。実行時にこれらの種類のエラーをキャッチするのに役立つように、意図的にメモリをガベージで埋めるデバッグツールさえあります。
私たちが取り組んでいるレガシー C システムでは、これらに悩まされています。約 80% の確率で、シングル スレッド コードでこのような状況に遭遇した場合、それはある種の初期化されていないメモリ (通常は初期化されていない変数) が原因です。タイミング固有の問題を示す傾向があるマルチスレッド コードの場合、それは多くの場合、データ競合です。
このような未定義の動作を回避するための安全な慣行を実践することは非常に重要です。なぜなら、問題がコード内のどこにあるかを絞り込むどころか、そもそも問題を再現するのが非常に面倒になるからです。未定義の動作は実際には未定義であり、非常に危険なので避けてください。システムによっては動作する場合としない場合があり、システムによっては動作する場合としない場合があり、動作する場合があるという事実が、これらのバグを最も厄介なものにしています (毎回失敗するものは実際にはずっと良くなります)。
もう 1 つの一般的な初心者の問題は、基本ポインターを介して削除するときに、基本クラスを仮想化するのに失敗することです。それほど一般的ではありませんが、私がテストしたシステムでは、非常に複雑な動作が発生する可能性があります。繰り返しになりますが、このようなあいまいな説明では問題が何であるかを事前に知ることは困難ですが、通常は何らかの未定義の動作になります。
デストラクタを見るか、コンストラクタをコピーすることができます。
リリース モードでビルドすると、不要なオブジェクトのコピーなどを最適化できます。
コマンド ラインからプログラムを起動し、後でアタッチするとどうなりますか?