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バグかもしれない?
ありがとうございます!
マイケル、答えをありがとう。しかし、両方のnew/deleteは同じRELEASE DLLで行われるため、どのようにその混合が実際に起こるかはわかりません。 DLLに割り当てられた同じメモリブロックも、同じDLLに組み込まれた新しい/削除オーバーロードのために同じDLLによって解放されます。ブーストを使用する前に、私はそのライブラリを広範囲に使用していましたが、CRTはそれについて一度も不平を言いませんでした。ブーストでのみ、その特定のパーサーオブジェクトで発生します。それは私に無駄になります... – user555746
@ user555746:それは面白いです...と私は最初の思考で期待するものではありません。標準的なブーストダウンロードを使用して合理的に小さな再現のケースはありますか? –
私がしていることは次のとおりです: 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