0

このコードをデバッグ モードで実行すると例外は表示されませんが、リリース モードでは次の例外が発生します。

RealTimeSLT.exe の 0x768b4b32 で未処理の例外: Microsoft C++ 例外: cv::Exception at memory location 0x003de734..

この問題がリリース時にのみ表示されるのはなぜですか?どうすれば修正できますか??

FileStorage fs2(fileName, FileStorage::READ);
fs2.open(fileName, FileStorage::READ);
fs2["Mat"] >> Mat;  
fs2["dMat"]>> dMat; 
fs2.release();
4

4 に答える 4

2

VS で実行していると仮定して、[デバッグ] -> [例外] を選択し、[例外がスローされたときにブレーク] をクリックします。

デバッガーの下でアプリを実行し、その例外がスローされる理由とその不平を確認します。おそらく、アプリが実行されている環境で何かが異なる可能性があります。

変数を調べる必要がある場合、オプティマイザーがデバッガーを混乱させる可能性があるため、リリース ビルドはこれを困難にします。リリース ビルドで最適化をオフにすることで、おそらくこれを解決できます。ただし、タイミングの問題である場合、これにより問題が隠される可能性があります。

もう 1 つのオプションは、スローされた例外をキャッチし、その内部メッセージをログに記録することです。これは通常、'what()' などと呼ばれる関数です。これにより、実際の問題が指摘される可能性が非常に高くなります。とにかく、この例外をキャッチしたいと思うでしょう。

未定義の動作がリリースとデバッグの違いを引き起こしている場合、上記はあまり役に立たない可能性があります。

于 2013-05-20T12:23:03.493 に答える
0

コードが奇妙に見えます。

あなたの FileStorage オブジェクトについてこれ以上知らなくても、最初の行でスタックに作成されていることがわかります。

release() がある種の参照カウント方法であると仮定すると、 fs2.release() は参照カウントがゼロになるため、それを削除しようとします。

スタックに割り当てられたオブジェクトを削除するのは良くありません。クラッシュします。

(1)代わりにこれを試してください(つまり、ヒープに割り当てます)

FileStorage fs2 = new FileStorage(fileName, FileStorage::READ);

(オブジェクトに参照カウントのセマンティクスが組み込まれていると仮定します。ドキュメントを確認してください)。

または 2: スタックが巻き戻されると fs2 が範囲外になるため、最後の行を削除します。

于 2013-05-20T12:22:51.173 に答える