2016-08-21 5 views
0

Microsoft Visual Studio 2015 (v14.0)私には3つのプロジェクトが含まれています。ランタイムライブラリのランタイムライブラリオプションの変更による影響

これらのプロジェクトのうちの2つはDLLであり、もう1つは実行可能ファイルです。
実行可能ファイルは実行時にDLLを読み込み、関数を呼び出してパラメータを交換します。 WindowのLoadLibrary、およびGetProcAddress APIを使用します。

モードでは、私のプロジェクトのRuntime LibraryMulti-threaded DLLに設定すると、すべて正常に動作します。 Debugモードの場合はMulti-threaded Debug DLLです。

私はDebugためReleaseまたはMulti-threaded DebugためMulti-threadedに変更した場合、私はデバッグアサーションエラーやメモリアクセス違反のエラーやエラーの他の種類を取得を開始。

Multi-threadedオプションを使用すると、実行可能ファイルにターゲットマシンのC++ランタイムライブラリが必要なくなるため、このオプションを使用する必要があります(この変更は、ソリューションのすべてのプロジェクトで変更されます)。どうすればこの問題を解決できますか?

答えて

0

エンティティの実行時間(つまりDLLと実行可能ファイル)がそれぞれ独自のランタイムを持つため、それぞれのヒープが1つにメモリを割り当てようとしていて、別のメモリに解放しようとするとエラーになります。他のモジュールは割り当てられたメモリを認識していなかったためです。
一方、/MDを使用すると、すべてのモジュールが同じランタイムを共有し、ランタイムは1つのメモリに割り当てられたメモリを認識するので、他のモジュールで解放することができます。ランタイムの1つのインスタンスがメモリ全体を管理するためです。

EDIT:dxivコメントに 感謝。

+0

あなたが書いたものにはいくつかの誤解があります。アドレス空間はプロセスごとであり、DLL *は常にそれらをロードしたプロセスと同じプロセスを使用して同じアドレス空間を共有します。同じプロセス内の他の場所から1つのDLL関数に割り当てられたメモリにアクセスすることは完全に安全です。 '/ MT'は、各DLLが独自のコードを持っているので、'/MT'は一つのDLL内のコードにメモリ( 'new')を割り当ててから別のDLLのコードで解放します静的にリンクされたCRTのコピー。たとえば、[この回答](http://stackoverflow.com/a/8157934)を参照してください。 – dxiv

+1

@dxivあなたのコメントはありがとうございます。私は答えを修正しました。 –

関連する問題