これが「コンパイルされるので、動作するはずです!」のように聞こえる場合は申し訳ありません。質問ですが、なぜ何かが起こっているのか (場合によっては起こっていないのか) を理解したいと思います。
プロジェクト設定で、に設定Basic Runtime Checks
しましたBoth
。デバッガーは次のことを通知します。
実行時チェックの失敗 #2 - 変数「beg」の周りのスタックが壊れていました。
しかし、デフォルト (なし) に設定すると、プログラムは正常に実行されて完了し、例外はスローされず、エラーも発生しません。
私の質問は、これを安全に無視できますか (MSVC++ が何らかの形で間違っている可能性があるため)、またはこれは本当の問題ですか? スタックが台無しになったときに、プログラムがどのように正常に続行できるかわかりません。
編集:
このエラーの原因となる関数は、次のようになります。
int fun(list<int>::iterator&, const list<int>::iterator&);
int foo(list<int>& l) {
list<int>::iterator beg = l.begin();
list<int>::iterator end = l.end();
return fun(beg, end);
}
fun
はインクリメントして動作しbeg
、返されると、beg == end
、MSVC++ が壊れると、最後の を指し}
ます。
編集2:
問題を切り分けました。場合によっては、反復する項目fun
の所有者からいくつかの要素を削除します。list
これがエラーの原因です。