Visual C ++ 2010 std :: set не работает - PullRequest
0 голосов
/ 24 ноября 2010

Я переключаюсь с 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 пуст в случае сбоя.

РЕДАКТИРОВАТЬ: Спасибо за быстрые ответы ... Я не могу воспроизвести его в простом случае - это, вероятно, не проблема с самим набором.Я думаю, что повреждение кучи может быть виновником - я просто хотел бы знать, почему изменение компиляторов внезапно приведет к повреждению для того же кода и тех же входных данных.

1 Ответ

1 голос
/ 24 ноября 2010

Единственное, о чем я могу думать, это то, что у вас есть несколько потоков, и m_mustfindStops на самом деле является членом или глобальной переменной, а не локальной для этой функции.Приведенный выше код никоим образом не может вызвать проблемы, если он правильный и взятый отдельно.

Если у вас несколько потоков, то доступ для чтения одновременно с доступом на запись вызовет случайные ошибки - даже если контейнер выглядит пустым, онВозможно, этого не произошло, когда начался вызов find.

Другая возможность состоит в том, что какой-то другой код повредил кучу, и в этом случае любой ваш код, использующий память кучи, может работать неправильно.Имея это в виду, что если всегда нарушается эта логика, моя ставка была бы на проблему с многопоточностью.

Кстати - в Visual C ++ v10 нет абсолютно ничего плохого в std::set - ваш код должен иметь ошибку.

...