2017-11-29 6 views
-1

DLLから割り当てられたメモリを削除します。/MDdのDLLメモリを/ MD Exeファイルから削除すると、ヒープの破損が発生する

Iテスト..

  1. エグゼ:/ MD、DLL:/ MDD => HeapCorruption。
  2. exe:/ MD、DLL:/ MD =>私が見る限り、仕事の井戸です。

でもLocalAllocは同じ結果になります...

限り、私が知っているように、マルチスレッドDLLのCRTは同じヒープメモリを使用しています。 ケース1テストが常にヒープ破損している理由を教えてください。

とどのように修正できますか?

- 追加。
ofcourse割り当て/削除を同じ場所で制限するのが最適です。

しかし、私のprobは.. です。サイズは最初にexeファイルから見ることができますが、dllは出力パラメータでメモリを使用する必要があります。 - サイズを照会してからバッファを取得するのが目的ではない(dllユーザにとって複雑すぎる)

+0

デバッグとリリースをミックスしていますか? '/ MDd'はデバッグに使用されます。 '/ MD'をリリースしました。デバッグとリリースを混在させると、デバッグヒープがリリースヒープと互換性がないため、ヒープが破損する可能性が高くなります。 – drescherjm

+0

デバッグCRTは異なるアロケータを使用しているため、優れた診断機能を提供します。 2012年以前のVSバージョンでは独自のヒープが作成されました。確かに、これはすべてうまくいっていないはずです。あなたはこれらの問題を強く避けることができます。両方のプロジェクトを持つVSでソリューションを作成できます。これらのプロジェクトを同期させて簡単に構築し、テストすることが簡単にできます。それを利用しないことは大きな間違いです。 –

答えて

0

dellからexeの割り当てられたメモリを削除します。

これはお勧めできません。コードメモリ割り当てと対応する割り当て解除をEXEまたはDLLのどちらかに残す方が良いでしょう。

EXEとDLLが両方とも同じビルドタイプ(デバッグ/リリース)であっても、メモリが他のメモリに割り当てられている場合は、そのメモリを割り当て解除しないでください。

メモリを同じユニット、つまりEXEまたはDLLに割り当て、割り当てを解除すると、メモリ破損の問題に陥ることなく、デバッグバージョンと非デバッグバージョンを混在させることができます。

+0

または、特にモジュール間の使用を目的としたCoTaskMemAlloc/CoTaskMemFreeのような割り当てペアを使用してください。 – SoronelHaetir

関連する問題