0

私は Visual Studio 2008 -> 2010 から移行していますが、ポインターの std::set で検索を評価するときに、コードに奇妙なバグが発生しました。

このバージョンでは、set::iterator が set::const_iterator と同じ型を持つように変更され、標準との互換性がもたらされることを私は知っています。しかし、以前は機能していたこのコード セクションがクラッシュする理由がわかりません。

void checkStop(Stop* stop)
{
    set<Stop*>                      m_mustFindStops;
    if (m_mustFindStops.find(stop) != m_mustFindStops.end()) // this line crashes for some reason??
    {
         // do some stuff
    }
}

PS m_mustFindStops は、クラッシュすると空になります。

編集:迅速な返信をありがとう...単純なケースでも再現できません-おそらくセット自体の問題ではありません。ヒープの破損が原因である可能性があると思います-コンパイラを変更すると、同じコードと同じ入力データが突然破損する理由を知っていればよかったのにと思います。

4

1 に答える 1

1

私が考えることができる唯一のことは、複数のスレッドがありm_mustfindStops、実際にはメンバーまたはグローバル変数であり、この関数のローカル変数ではないということです。上記のコードが正しく、単独で使用される場合、問題が発生する可能性はありません。

複数のスレッドがある場合、書き込みアクセスと同時に読み取りアクセスを行うと、ランダム エラーが発生します。コンテナーが空に見えても、find呼び出しが開始されたときではない可能性があります。

もう 1 つの可能性は、他のコードがヒープを破損したことです。この場合、ヒープ メモリを使用するコードのいずれかが誤動作する可能性があります。それを念頭に置いて、壊れるのが常にこのロジックである場合、私の賭けはスレッドの問題になります。

std::setところで、Visual C++ v10にはまったく問題はありません。コードにバグがあるはずです。

于 2010-11-24T03:28:55.990 に答える