1. ホーム
  2. c++

[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。

2022-01-23 15:11:33

質問

gccでコンパイルすると正常に動作するC++プログラムを、Visual 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();
                }
            }
        }
    }

ベクターが使用されている各行にブレークポイントを置くだけでは、ループが何千回も繰り返され、そのたびにcontinueを押さなければならず、文字通り何時間もかかってしまうからです。エラーが発生したら、適切な行でブレークするようにデバッガに指示する方法はないでしょうか。変数を調べて、どの変数が範囲外なのかを判断するのに役立ちます。

解決方法を教えてください。

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

i 1 2 3 Ei v1 v2 v3

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

i 1 2 Ei v2 v3

最終的には、ベクトルの終端を越えて反復することで、ベクトルの終端を指すポインタを持つことができるようになると思います。 完全に推測ですが、あなたがやろうとしていることを行うには、おそらくもっと簡単な方法があるはずです。 ただ、あなたが何をしようとしているのかがわからないのです。

2次元配列の行と列を反転させながら、その対角線上のポリゴンを新しい配列に格納しようとしているように見えます。 とにかく、forループの最初に赤丸を付けて、一行ずつコードを見ていってください。

私ならtemp vectorを作り、for loopでそれらを修正し、vector openPolygonListを置き換えます。