2010-12-28 3 views
1

Boost:runtime:cla::parser::~parserへのブーストコール中に無効なメモリブロックが発生すると思われる問題があります。その世界的な削除は、そのオブジェクトで呼び出された場合、C++は無効として、メモリブロックにアサート:ブーストにより新規ブロック/削除演算子のオーバーロード中に無効なブロックが発生する

dbgdel.cpp(52): 

/* verify block type */ 
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)); 

調査私は問題があるため、新規のグローバルな過負荷の起こったことを明らかにしなかった/演算子を削除します。これらのオーバーロードは別々のDLLに格納されます。主なアプリケーションがDEBUGでコンパイルされている間に、DLLがRELEASEでコンパイルされているときにのみ問題が発生することがわかりました。

リリース/デバッグビルドのフレーバは、新規/削除演算子のオーバーロード時にBoost/CRTでこのような問題を引き起こしていると考えました。だから私は明示的に_malloc_dbgと_free_dbgを明示的に呼び出そうとしましたが、リリースモードでもオーバーロード機能を使っていましたが、無効なヒープブロックの問題は解決しませんでした。

問題の根本原因は何ですか?その状況は解決可能ですか?

ブーストを使用し始めたときにだけ問題が始まったことを強調しておきます。その前に、CRTは無効なメモリブロックについて一度も苦情を言わなかった。だから内部のBoostバグかもしれない?

ありがとうございます!

答えて

2

私はこの問題は、メインアプリケーションが一般的にはあなたがいる場合、デバッグCRTにリリースCRTを使用したモジュールを混在させることはできませんDEBUG

をコンパイルしている間にそのDLLがRELEASEでコンパイルされたときにのみ起こることを発見1つのタイプのランタイムからのメモリ割り当ては、他のランタイムによって解放されます(他の問題があるかもしれませんが、メモリ割り当ての問題が最も多く発生するようです)。

解決策は、デバッグランタイムに対して相互に構築されたモジュールと、リリースランタイムに対して相互に構築されたモジュールを使用することです。これら2つを混在させないでください。

Microsoftの説明はここで見つけることができます:CRTライブラリの各コピーは、によって解放される1つのCRTライブラリでメモリを割り当て、DLLの境界を越えてポインタを渡し、独自のヒープマネージャを持っているhttp://msdn.microsoft.com/en-us/library/ms235460.aspx

ので、 CRTライブラリの別のコピーは、ヒープ破損の潜在的な原因です。

+0

マイケル、答えをありがとう。しかし、両方のnew/deleteは同じRELEASE DLLで行われるため、どのようにその混合が実際に起こるかはわかりません。 DLLに割り当てられた同じメモリブロックも、同じDLLに組み込まれた新しい/削除オーバーロードのために同じDLLによって解放されます。ブーストを使用する前に、私はそのライブラリを広範囲に使用していましたが、CRTはそれについて一度も不平を言いませんでした。ブーストでのみ、その特定のパーサーオブジェクトで発生します。それは私に無駄になります... – user555746

+0

@ user555746:それは面白いです...と私は最初の思考で期待するものではありません。標準的なブーストダウンロードを使用して合理的に小さな再現のケースはありますか? –

+0

私がしていることは次のとおりです: 1. BoostのAPIを使ってaunitテストを実装するための標準Boostライブラリを使ってEXEを作成します - ユニットテストを空のままにしておいてください 2.単純なDLLを作成し、/deleteと単にmalloc/freeを内部で実行する 3. EXE内でグローバル/グローバルにオーバーロードし、エクスポートされた関数をDLLから呼び出して、呼び出しを委任する 4。アプリケーションを実行し、CRTティアダウン中にboost :: runtime :: cla :: parser ::〜parserのASSERTを取得する必要があります。おそらく内部クラスの1つですBoostがユニットテストフレームワークのために使用しています – user555746