2016-04-22 10 views
0

std :: advanceを使用して1つ以上のベクトルを反復しようとしています。デバッグビルドとリリースビルドの間には、のデバッグの違いがあり、実際のアプリケーションでもさらに拡張されたケースでもリリースが動作する間に、ベクトルイテレータ+オフセットが範囲外になります。なぜこれが起こり、どうすればデバッグで実行できるように書くことができますか?std :: advance - デバッグ時に範囲外のオフセットが発生しました

vector<glm::vec2> testV; 
testV.push_back(glm::vec2(0.f)); 
int step = 2; 

for (auto it = testV.begin(); it != testV.end();) 
{ 
    if (it + step <= testV.end()) 
     advance(it, step); 

    else 
     ++it; 
} 

(私はハングを起こしループで何かを印刷していない限り)、これはまた、イテレータのための加算演算子が返されたイテレータを検証している

for (auto it = testV.begin(); it != testV.end();) 
    advance(it, step); 
+0

*私はstd :: advance *を使って1つ以上のベクトルを反復しようとしています - これは0から 'testV.size()'への 'for'ループが良いオプション。 – PaulMcKenzie

答えて

4

リリース上で実行されます。 2を追加して最後を過ぎると、デバッグ時にエラーが発生します。リリースビルドにはこれらのチェックがないため、問題が報告されません。

コンテナの最後を過ぎたイテレータポイントを持つことは、未定義の動作だと思います。それは間違いなく間接的です。

あなたは何か他の方法で最後を過ぎて行くのを確認する必要があります。

関連する問題