2

DLL と、この DLL を使用する 3 つのアプリケーションがあります。(これらのアプリケーションは同時に実行されません)

3 つのアプリケーションのうち、2 つが完全に動作しますが、1 つのアプリケーションがしばらくして 1 つの DLL 関数から応答を取得しません (具体的には、7 回目の関数呼び出しで)。また、アプリケーションまたは DLL のデバッグ バージョンを使用すると、コードは正常に動作します。Release版のみ停止します。

眠れぬ夜を 2 晩過ごした後、DLL のプロジェクト プロパティを から に変更/MDすると/MT、このアプリケーションが正常に動作することがわかりました。

なぜこのようなことが起こっているのか、私にはわかりません。睡眠不足のプログラマーのために、誰かこれを説明してくれませんか!

アップデート:

私はこの DLL を市場にリリースしますが、ユーザー アプリケーションがビルドされるかどうかはわかりません/MT/MTDどのアプリケーションでも動作することを確認する方法はありますか。

4

2 に答える 2

2

Windows で言えば、EXE ファイルと DLL ファイルはモジュールです。動的にコンパイルされた各モジュール (/MD) は、1 つのヒープを共有します。したがって、動的モジュールでは、1 つのモジュールが malloc (または new) を呼び出し、別のモジュールがオブジェクトに対して free (または delete) を実行する場合、すべて問題ありません。

C ランタイムでリンクするようにコンパイルされた各モジュールは、独自のヒープを静的に取得します。 ある静的モジュールがオブジェクトを割り当て、別の静的モジュールまたは動的モジュールがそのオブジェクトを解放しようとすると、割り当てと解放が異なるヒープに対して行われるため、プログラムがクラッシュします。

モジュールの境界を越えたメモリの割り当てと解放

于 2013-09-05T12:51:28.603 に答える
0

/MD は、ランタイムを動的としてリンクします。コンピューターにランタイムが適切にインストールされている場合は、ランタイムがバイナリに含まれるため、/MT としてコンパイルすると機能します。

これは、デバッグ モードでコンパイルしたときに機能している間も説明できます。デバッグ モードでは、ランタイムのデバッグ バージョンがバイナリに静的にリンクされます。

このトピックに関する議論については、こちらを参照してください。

更新別の問題は、このmsdn 記事 に記載されているように、dll が異なるオプションでコンパイルされたモジュールである可能性があります。

リンカーの特定の呼び出しに渡されるすべてのモジュールは、同じランタイム ライブラリ コンパイラ オプション (/MD、/MT、/LD) でコンパイルされている必要があります。

于 2013-09-05T11:58:19.707 に答える