-1

これが「コンパイルされるので、動作するはずです!」のように聞こえる場合は申し訳ありません。質問ですが、なぜ何かが起こっているのか (場合によっては起こっていないのか) を理解したいと思います。

プロジェクト設定で、に設定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これがエラーの原因です。

4

2 に答える 2

4

問題を再現するコードがなければ、あなたの質問には答えられません。

しかし、一般的な問題に対して漠然とした答えを出すには - コンパイラーまたはデバッガーが問題を検出した場合、おそらく問題があります。

C++ では、何かが「うまくいかない」からといって、プログラムがクラッシュするわけではありません。完全に予測できない結果で実行し​​続ける可能性があります。それはあなたが望む結果で完了するかもしれません. しかし、あなたのシステムで問題なく実行されたからといって、他のシステム、コンパイラ、時間帯、さらには同じプログラムの追加の実行に対する保証はありません。

これはundefined behaviorと呼ばれ、言語を間違って使用することによって引き起こされます (ただし、コンパイルの失敗を引き起こす方法ではありません)。バッファ オーバーランは、数十ある例の 1 つにすぎません。

于 2011-07-31T04:23:52.907 に答える
1

私のVisual Studioのインストールに問題があることが判明したため、再インストールすると問題が解決しました。

于 2011-08-02T01:58:05.627 に答える