Почему BOOST_FOREACH иногда не работает со строками C++?

Я использую BOOST_FOREACH для перебора символов строки C++, например:

void foobar(const string& str)
{
    BOOST_FOREACH(const char ch, str)
    {
        // Do something with ch
    }

    return;
}

Этот фрагмент кода отлично работает со следующими режимами компиляции:

  • Многопоточный (выпуск) (/MT)
  • Многопоточная отладка (/MTd)
  • Многопоточная DLL (Release) (/MD)

Это вызывает ошибки времени выполнения (исключения) только в этом режиме:

  • Многопоточная отладочная DLL (выпуск) (/MDd)

В приведенном выше фрагменте кода нет ошибок или предупреждений компиляции, что наводит меня на мысль, что BOOST_FOREACH знает контейнер, который он обрабатывает здесь. Также меняется const char ch в const char& ch не имеет никаких изменений в поведении.

Почему этот код вызывает плохое поведение во время выполнения?

Почему только в режиме отладки DLL?

Это использование BOOST_FOREACH в строках C++ неправильно?

Если да, то как лучше всего обойти это?

(Обратите внимание, что я работаю с Visual Studio 2008 и Boost 1.39.)

2 ответа

Использование BOOST_FOREACH в строках C++ абсолютно правильно (см. http://www.boost.org/doc/libs/1_39_0/doc/html/foreach.html).
Похоже, проблема в

  
// Do something with ch

Вы должны дать нам больше информации о своем коде, потому что:

  • Ваша проблема связана с используемой средой выполнения VC++
  • Как прямо ответил Дмитрий, ваша проблема, скорее всего, вызвана телом цикла

Во всяком случае, с небольшой информацией, которую вы нам дали, я могу предположить следующее:

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

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

Если вы хотите получить больше информации, вам необходимо предоставить нам следующую информацию:

  • Может ли строковый объект поступить из другого модуля (другой DLL, другой LIB, другого EXE), возможно, скомпилированный с другой средой выполнения?
  • Если вы пишете код вручную (используя старое "for"), он работает?
  • Какое точное сообщение об ошибке?
Другие вопросы по тегам