デバッガーで実行しているときにのみ「ヒープの破損」エラー メッセージが表示されるのは、デバッガーを使用しているときにヒープが役に立っているためです。
具体的には、WindowsCreateHeap()
関数は、プロセスがデバッグされているかどうかを確認します。SetHeapInformation()
その場合、フラグHeapEnableTerminationOnCorruptionを使用した呼び出しと同等の処理が行われます。これは、ヒープの破損を見つけてデバッグする際の支援として提供されます。関連するパフォーマンスのペナルティがあるため、常に提供されるわけではありません。
デバッガー内からプログラムを起動するのではなく、プログラムの開始後にデバッガーをアタッチすると、CreateHeap()
呼び出しは既に渡され、ヒープは通常モードで動作します。
ヒープの破損は、ヒープから返されたブロックの境界を超えて書き込むことによって発生します。たとえば、16 バイトの文字列を 8 バイトの割り当てにコピーします。ヒープから返されたブロックの境界を越えて、ヒープ データ構造によって使用される構造があります。たとえば、割り当てられたブロックの周囲にリンク リスト ポインターが見つかる場合があります。
プログラムがブロックの境界を超えて書き込むと、周囲の情報にヒットする場合とヒットしない場合があり、クラッシュが発生します。プログラムでヒープ オーバーランが発生すると、検出が困難になる場合があります。次に、ユーザーのマシンでは、そのヒープ オーバーランが常にクラッシュにつながる可能性があります。
ヒープ オーバーランでコードをリリースするという恥ずかしさから解放されるように、CreateHeap()
API は、より多くの情報を提供するようにヒープを構成することで、ユーザーを助けようとしています。
ただし、これを機能させるために OpenCV で何をする必要があるかはわかりません。の前に呼び出す必要のあるセットアップ ルーチンが他にないことを確認しますcvNamedWindow()
。
デバッガーで、終了メッセージを表示する API にブレークポイントを設定できますか? FatalAppExit()
およびAPI にブレークポイントを設定してExitProcess()
、ヒープがいつエラーを生成しているかを正確に確認してみてください。への呼び出しの前ですか、それとも後cvNamedWindow()
ですか?