web-dev-qa-db-ja.com

「デバッグアサーションに失敗しました」の原因となるVisualC ++検索行

Visual C++で正しく動作するようにgccでコンパイルしたときに正常に動作するC++プログラムを取得しようとしています。私の問題は、次のエラーが発生することです。

Debug Assertion Failed!

Program: C:\WINDOWS\SYSTEM32\MSVCP110D.dll
File: c:\program files (x86)\Microsoft visual studio 11.0\vc\include\vector
Line: 1140

Expression: vector subscript out of range

私の本当の問題は、これがいつどこで起こるのかわからないことです。エラーウィンドウでbreakを押すと、例外が最終的に発生したベクトルクラスの部分に移動するだけです。実際にそれを引き起こしたアプリケーション内の場所を見つけたいです。私はそれを次のコードブロックに絞り込むことができました:

    for(unsigned int i=0;i<openPolygonList.size();i++)//error somewhere in here
    {
        if (openPolygonList[i].size() < 1) continue;
        for(unsigned int j=0;j<openPolygonList.size();j++)
        {
            if (openPolygonList[j].size() < 1) continue;

            Point diff = openPolygonList[i][openPolygonList[i].size()-1] - openPolygonList[j][0];
            int64_t distSquared = vSize2(diff);

            if (distSquared < 2 * 2)
            {
                if (i == j)
                {
                    polygonList.Push_back(openPolygonList[i]);
                    openPolygonList.erase(openPolygonList.begin() + i);
                }else{
                    for(unsigned int n=0; n<openPolygonList[j].size(); n++)
                        openPolygonList[i].Push_back(openPolygonList[j][n]);

                    openPolygonList[j].clear();
                }
            }
        }
    }

ループは何千回も繰り返され、毎回続行を押す必要があるため、文字通り何時間もかかるため、ベクトルが使用される各行にブレークポイントを配置するだけではオプションではありません。エラーが発生したら、適切なラインでブレーキをかけるようにデバッガーに指示する方法はありますか?変数を調べて、どの変数が範囲外であるかを判断するのに役立ちますか?

6
Gerharddc

問題は、反復しているベクトルのメンバーを消去していることだと思います。最初の要素を消去するとどうなりますか?

i 1 2 3 Ei v1 v2 v3

I = 1のときに1を消去すると、ベクトルのインデックスと値は以下になり、i = 2になります。

i 1 2 Ei v2 v3

最終的には、ベクトルの終わりを超えて反復することで、ベクトルの終わりを超えて指すポインターを作成できると思います。ここでは完全な推測が機能しますが、実行しようとしていることを実行するためのより簡単な方法がおそらくあります。私はあなたが何をしようとしているのか理解できません。

配列内の対角ポリゴンを新しい配列に格納しながら、2次元配列の行と列を反転しようとしているようです。とにかく、はい。ただし、forループの先頭にある赤い円で、コードを1行ずつ見ていきます。

一時ベクトルを作成し、forループでそれらを変更してから、ベクトルopenPolygonListを置き換えます。

4
Chemistpp

デバッガーは将来を予測できませんが、all例外(ctrl + atl + eで、[スロー]の下のすべてのボックスにチェックマークを付ける)で中断するように指示できます。アサーションが発生すると、コールスタックを下ってコードに移動すると、問題の原因となっている行がわかります。

4
doctorlove

コールスタックウィンドウ([デバッグ]-> [ウィンドウ]-> [CallStack])を開いて、アサーションにつながったプログラム内の場所を見つけることができます。一番上の行より2行または3行下にある必要があります。

3
kovarex