2009-04-30 38 views
0

私はWin32/ATLで作成されたアプリケーション/ GUIで作業しています。 したがって、デバッグビルドで設計されたとおりにうまく動作するUIフィールド(テキストフィールド)があります。リリースビルドでは不正な形式になり、テキストフィールドの幅が無限にあるように見えます。 デバッグビルドでうまく動作しますが、リリースビルドで問題が発生します。 私の質問はどのように同じコードをデバッグビルドで動作させることができ、リリースビルドでは動作しません。 リリースビルドの最適化設定に関連する可能性はありますか? リリースビルドでは、最適化設定を[最小サイズ]、[小さなコードを優先]に設定しています。 リリースビルドをデバッグしようとすると、再びうまく動作します。リリースビルドでのデバッグは最適化を削除しますか?VSの最適化設定

私は、リリースビルドでデバッグするか、可能ならばデバッグビルドであってもよく、一方で問題を再現します。 提案がありますか?

+0

私はデバッグビルドで/ RTCオプションを有効にしました。しかし、私のデバッグビルドは正常に動作しています。私の理解によると、RTCオプションは初期化されていない変数を0xCCにして、プログラムがクラッシュしたり、奇妙な結果を表示したりするはずです。 – anand

+0

私はデバッグビルドをリリースビルドでの動作として動作させることができる他の方法はありますか?または、私のリリースビルドをデバッグして問題を解決する方法がありますか? – anand

答えて

2

VC++は特別な値で、デバッグモードでの実行時のメモリを埋めます。しかし、固定またはゼロ初期化を保証するものではありません。詳細は、このSOスレッドを読んでください。 Uninitialized Memory Blocks。これらの値は毎回アプリケーションをクラッシュさせることはありません。

私は似たような状況の中にいくつかの時間を実行しました。 1つの一般的な例は、配列の境界を越えたアクセスはエラーです。多くの場合、これはデバッグモードでは明白ではありませんでしたが、リリースビルドでクラッシュしました。一般に、ランタイムはデバッグモードでは控えめであり、プログラマーのエラーをより多くカバーします。

他の人が指摘しているように、コードには明らかに問題があります。おそらく初期化されていない変数です。

0

私の頭の上から外してください:あなたが使用しているASSERTには、リリースビルドでは破棄されているので、何もロジックが含まれていないことを確認してください。

0

これは、最適化を行うには何もありません。デバッグビルドでは、コンパイラは一般に変数を既知の値に初期化しますが、リリースビルドでは変数は初期化されません。あなたが記述した症状は、おそらくコード内の初期化されていない変数またはポインタによるものです。

+0

値を知るために初期化することを意味しますか? 私は1つの変数を持っています int i; デバッグビルドでは、私は0に初期化されますか? この設定を上書きできる方法はありますか? – anand

1

オプションを使用して/RTC (Run-Time Error Checksコンパイラフラグを有効にしてみてください。これにより、初期化されていない変数の診断に役立つ非ゼロ値にローカル変数が初期化されます。

関連する問題