1

マルチスレッド デバッグ DLL (/MDd) とマルチスレッド デバッグ (/MTd) の設定について質問があります。それらの違いは明らかです。一方は動的ライブラリを使用し、もう一方は静的ライブラリを使用しています。/MDd を使用してプログラムをコンパイルすると、すべてがうまくいきます。しかし、設定を /MTd に変更してプログラムを実行すると、Visual Studio はポップアップ メッセージ ボックスでプログラムのブレークポイントをトリガーします。メッセージは次のとおりです。

Windows は、application.exe でブレークポイントをトリガーしました。

これは、ヒープの破損が原因である可能性があります。これは、application.exe または読み込まれた DLL のバグを示しています。

これは、application.exe にフォーカスがあるときにユーザーが F12 キーを押したことが原因である可能性もあります。

出力ウィンドウには、より多くの診断情報が表示される場合があります。

この場合、私は次に何ができるのだろうかと考えていました。ありがとう!

4

2 に答える 2

2

アプリケーションに含めた他のライブラリが、DLL ランタイム ライブラリに対してコンパイルされる可能性があります。その場合、静的ランタイム ライブラリに対して実行可能ファイルをリンクしようとすると、2 つのコピー (1 つは静的、もう 1 つは動的) になります。メモリ割り当てのパターンによっては、ライブラリの 1 つのインスタンスがヒープに関する不完全な情報を持つ可能性があります。ライブラリのデバッグ バージョンはヒープの破損を検出しようとするため、エラーが表示されます。(リリース バージョンでは、まだエラーが発生する可能性があることに注意してください。通知が届かないだけです。)

静的または動的ランタイム ライブラリに対してリンクすることを決定するときは、通常、オール オア ナッシングを行う必要があります。また、標準の OS 以外の DLL を含める場合は、プロセス内のすべてが同じインスタンスを使用するように、ほぼ確実に動的ランタイムが必要です。

于 2013-05-22T16:49:09.533 に答える
1

コードを注意深く確認したところ、同じ問題を引き起こす可能性のある別の状況が見つかりました。つまり、メモリは 1 つの dll に配置されていますが、別の dll で解放されています。このトピックの詳細については、dll 境界を越えたメモリの割り当てと割り当て解除を参照してください。

于 2013-05-23T16:18:39.060 に答える