こんにちは。
ダイアログベースでプログラミングをしているのですが困ったことがあります。
AssertionFailedというエラーが出るのですが
これがどういった原因で出るのかが追求できません。
理由は次の2点・・・
・スレッドが同時にたくさん走っていることでデバッグ不可能。
・起こるとき起こらないときがあること。
この毎回同じメッセージなのでアサートが起こっている位置さえ特定できれば
いいのですが、この仕様だとそれがかなり困難なようです。
出るメッセージを記載しておきます。
実行後にアサートが出る位置を特定できる方法か
このメッセージだけで大体の原因がわかる方がいらっしゃいましたら教えてください。
少ない情報で申し訳ありません。よろしくお願いいたします。
DebugAssertionFailed!
*********
File:dbgheap.c
Line:1044
Expression:_CrtIsValidHeapPointer(pUserData)
「再試行」ボタンを押すと該当コードが見られます。
あ、このdbgheap.cは内部コードのようなんで
見ても良くわかりませんでした・・・・
止まった時に、「スタックトレース」を表示すると
呼び出し階層を見ることができます。
>DebugAssertionFailed!
>*********
>File:dbgheap.c
>Line:1044
>
>Expression:_CrtIsValidHeapPointer(pUserData)
から分る(推測できる)事は pUserData が変なところを指しているらしい
ということです。では何処で誰が pUserData に変な値を入れているのかに
なりますね。 VC++6 なら、コールスタックを使ってこのアサートが出る原因
コードが何処なのか探せるでしょう
>あ、このdbgheap.cは内部コードのようなんで
あう;; よく確かめもしないで書いてました。
んでそのちょっと上に
* If this ASSERT fails, a bad pointer has been passed in. It may be
* totally bogus, or it may have been allocated from another heap.
* The pointer MUST come from the 'local' heap.
(ヘボ訳:違うヒープメモリのポインタが渡されてきたかも)
とあるので、DLLから渡されたポインタをEXE側で破棄したとかいうことが
原因かも??です。
ちなみにwin32 DLLでnewしたポインタをwin32 EXEでdeleteするコードを書いたら
似たエラーが出ました。
大変参考になる意見ありがとうございます。
事象はまれに出るため、いま現在は確認できていませんが
結果がわかり次第報告に伺います。
ちなみに↓でも同じエラーが出ます。(島さんが書かれた事と同じ事だと思います)
char* p = new char[...];
delete[] (p+1);//違う場所をdeleteに渡す