以下のようなコードを書きました。
containerは1425件格納していました。
C++
1sortContainer(std::vector<UnitAlignmentData>& sort, OBJ select_col) 2{ 3 std::sort(container.begin(), container.end(), [select_col](const AlignmentData& l, const AlignmentData& r) { 4 5 if (l.getCol() != select_col) 6 { 7 return l.length > r.length; 8 } 9 else 10 { 11 return true; 12 } 13 }); 14}
これが呼び出された時にエラーが出て止まったのですが、
引数”l”を調べたところ、どうやら、containerの終端(end)のようでした。
いままで、ここに終端が渡されて来たことがなかったので気になっています。
他の部分の影響によって起こった誤動作であればよいのですが、
まずこれは仕様なのでしょうか?
リファレンスには特に書いてなかったのですがもし見落としていたらすみません。
以下追記です。
呼び出し元を見ました。
以下 forの条件文の所で「__i != __last」こうありますので、やはりバグのようだと思いました。
C++
1 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i) 2 { 3 if (__comp(*__i, *__j)) //<ここでエラーになってました。 4 { 5 value_type __t(_VSTD::move(*__i)); 6 _RandomAccessIterator __k = __j; 7 __j = __i; 8 do 9 { 10 *__j = _VSTD::move(*__k); 11 __j = __k; 12 } while (__j != __first && __comp(__t, *--__k)); 13 *__j = _VSTD::move(__t); 14 } 15 __j = __i; 16 }
ではなぜ、このようなことが起こるのでしょうか。
std::sortを実行中に、他のスレッドでコンテナの操作はしていませんでした。
以下追記です。
バックトレースからソートの実装を見ていたら
limit値を超える場合に、
__lastの値が書き換えられていました。
ただその詳細まで追えていません。
STLのバグなんでしょうか?
libc++(LLVM C++ STL with C++11 support)でした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/15 01:48 編集