[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
質問
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を置き換えます。
関連
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] C++ 実行時にベクターでアサーションが失敗した 表現:ベクターの添え字が範囲外である
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない