Share via


リリース ビルド作成時によくある問題

プログラムの開発では、通常、プロジェクトのデバッグ ビルドを使用してビルドとテストを行います。その後、リリース ビルドでアプリケーションをビルドすると、アクセス違反が発生する場合があります。

次は、デバッグ ビルドとリリース (非デバッグ) ビルドの主な相違点です。このほかにも相違点がありますが、ここで説明する相違点は、アプリケーションがデバッグ ビルドでは動作してもリリース ビルドではエラーになるような、大きな相違点です。

  • ヒープ レイアウト

  • コンパイル

  • ポインター サポート

  • 最適化

リリース ビルドのエラーをデバッグ ビルドでキャッチする方法については、/GZ (デバッグ ビルド時のリリース ビルド エラーのキャッチ) コンパイラ オプションを参照してください。

ヒープ レイアウト

ヒープ レイアウトは、デバッグでは動作するアプリケーションがリリースではエラーとなる原因の約 90% を占めます。

プロジェクトをデバッグ ビルドする場合は、デバッグ メモリ アロケーターが使用されます。このため、すべてのメモリ割り当ては、ガード バイトで囲まれます。ガード バイトによって、メモリの上書きが検出されます。リリース バージョンとデバッグ バージョンではヒープ レイアウトが異なるので、デバッグ ビルドではメモリの上書きによって問題が生じない場合でも、リリース ビルドでは致命的な問題が生じる場合があります。

詳細については、「メモリ上書きのチェック」および「デバッグ ビルドを使用したメモリ上書きのチェック」を参照してください。

コンパイル

リリース用にビルドする場合、大半の MFC マクロと MFC 実装が変更されます。特に、ASSERT マクロはリリース ビルドでは評価されないため、ASSERT にあるコードは実行されません。詳細については、「ASSERT ステートメントの確認」を参照してください。

リリース ビルドでは、実行速度を上げるために一部の関数がインライン化されます。通常、リリース ビルドでは最適化がオンになっています。また、使用されるメモリ アロケーターも異なります。

ポインター サポート

デバッグ情報がないと、アプリケーションから埋め込みが削除されます。リリース ビルドでは、不正なポインターが、デバッグ情報ではなく初期化されていないメモリを指す可能性があります。

最適化

最適化コンパイラは、特定のコード セグメントの内容に応じて、予期しないコードを生成することがあります。これがリリース ビルドの問題を引き起こすことはまれですが、問題が発生する場合もあります。解決方法については、「コードの最適化」を参照してください。

参照

関連項目

リリース ビルド

リリース ビルドの問題の解決