Почему 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"), он работает?
- Какое точное сообщение об ошибке?