C ++Builder2010を使用して構築された既存のより大きな製品の一部となるプログラムがあります。
小さいプログラムは(まだ)C++Builderに依存していません。MS Visual Studioでは正常に動作しますが、C ++ Builderを使用すると、奇妙なアクセス違反が発生します。
これを説明させてください。
コードとコンパイラの設定に応じて、アクセス違反が発生する場合と発生しない場合があります。アクセス違反は再現可能です。プログラムがビルドされると、アクセス違反は発生しないか、常に同じ場所で発生します。プログラムを同じ設定で再構築すると、同じ動作を示します。(私はそれについて本当にうれしいです)。
アクセス違反は、削除演算子が呼び出された場所で発生します。これは、(コンパイラの設定と正確なコードに応じて)特定のデストラクタ内(独自のクラスのデストラクタを含む)およびstd::stringのデストラクタ内で発生する可能性があります。
次のことにより、アクセス違反の可能性が低くなります。
- (「リリース」ではなく)「デバッグ」設定でビルドします。
- コンパイラの最適化はありません。
- コンパイラスイッチ「遅い例外エピローグ」。
- 動的ではなく静的RTL。
- BorlandのExceptionクラスではなく、std::exceptionから例外を取得します。
- あまり「複雑でない」式を使用します(たとえば、「throw SomeException(string( "...")+」の代わりに「string s = "..." + "..."; throw SomeException(s);」を使用します。 。");")
- デストラクタを使用した自動変数の代わりに、手動クリーンアップを使用してtry...__finallyを使用します。
- VCLWindowsアプリケーションの代わりに小さなコンソールアプリケーションを使用してください。
このプログラムは、例外、STL、移動コンストラクターなどを含むいくつかのC ++機能を利用し、もちろんヒープを使用します。
私はすでにいくつかのツールを試しましたが、どれも問題を報告しませんでした:
- ボーランドのCodeGuard。
- Microsoftアプリケーション検証ツール。
- pageheap/gflags。
- すでに述べたように、MSVisualStudioでビルドする場合はまったく問題ありません。
プリコンパイル済みヘッダーとインクリメンタルリンク(どちらもエラーが発生しやすいようです)の使用は無効になっています。
C ++ Builderコンパイラ(「すべての警告を有効にする」)もVisual Studio(/ W4)のコンパイラも、この問題に関連する可能性のある警告を生成しません。
別のバージョンのC++Builderにアクセスできません。
プログラムはより大きな製品の一部になるため、別のコンパイラに切り替えるオプションはなく、アクセス違反が発生しなくなるまでコンパイラ設定を調整するオプションもありません。(これが本当にコンパイラのバグである場合、バグが再び現れる可能性があるのではないかと心配しています。)
これをまとめると、これはコンパイラのバグに関連するヒープの破損が原因である可能性があると思います。ただし、qc.embarcadero.comでバグを見つけることができませんでした。さらに、これは、例外がスローされたときにスタックの巻き戻し時に実行されるクリーンアップコードに関連していると推測しています。しかし、まあ、それはばかげたコードのバグにすぎないのかもしれません。
現在、どうすればいいのかわかりません。助けていただければ幸いです。前もって感謝します!