2010-11-24 13 views
0

私はVisual Studio 2008 - > 2010から変更しています。私はstd :: setのセットでfindを評価するときに私のコードに奇妙なバグを見つけました。Visual C++ 2010 std :: set find壊れた

このバージョンでは、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がクラッシュすると空になります。

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

+2

No repro。完全でコンパイル可能な例を投稿してください。 –

+2

エラーを再現できません。これは何かが間違っていることを示唆しています。エラーを再現し、実行できる最小のコンパイル可能な例は完璧です。 –

+2

私は、問題を発見したときに、自分のコードではなく、MSVC(これは天国以上にテストされている)がバグであると仮定すると、一人で、もしあれば)。あなたは@Jamieに行っていません(それは本当にあなたのタイトルと関係しています - テキスト自体は、バグがあなたのものだと思うかもしれないことを示しています)。たぶんあなたは "認知の不調"のWeb検索を行うべきです - "足で自分を撃って、次に銃を責める"という言葉は私がこれまでに聞いた最高の説明でした:-) – paxdiablo

答えて

1

私が考えることができるのは、複数のスレッドがあり、実際にはm_mustfindStopsがメンバーまたはグローバル変数であり、この関数のローカルではないということだけです。上記のコードが問題を引き起こす可能性はありません。

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

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

btw - Visual C++ v10でstd::setに間違いはありません。コードにバグがある必要があります。

+0

アプリケーションの一部はマルチスレッドですが、問題のセクションはありません。どのように腐敗の原因を追跡するための任意の考えですか? –

+0

@Jamie:コンパイラはどのような警告レベルに設定されていますか?それは警告なしでコンパイルされますか?生ポインタよりもスマートポインタを使用しましたか?演算子[]の代わりに()を使用しましたか?ヒープ境界(valgrindなど)をテストするために製品を使用しましたか。 –

+0

警告はエラーとして処理され、レベル3に設定されます。一般的にスマートポインタを使用し、私たちの方針はベクトルのために.at()を使うことです。前にvalgrindを使用していない...私は考えることを開始する必要があります –

関連する問題