为什么BOOST_FOREACH有时不能用C ++字符串工作?

时间:2009-08-14 03:03:52

标签: c++ visual-studio string boost

我正在使用BOOST_FOREACH迭代C ++字符串中的字符,如下所示:

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

    return;
}

这段代码适用于以下编译模式:

  • 多线程(发布)(/ MT)
  • 多线程调试(/ MTd)
  • 多线程DLL(发布)(/ MD)

仅在此模式下导致运行时错误(例外):

  • 多线程调试DLL(发布)(/ MDd)

上面的代码片段没有编译错误或警告,让我相信BOOST_FOREACH知道它在这里处理的容器。此外,将const char ch更改为const char& ch的行为也没有变化。

为什么这段代码会导致这种错误的运行时行为?

为什么只在Debug DLL模式下?

对C ++字符串的BOOST_FOREACH的这种用法是错误的吗?

如果是,那么最好的解决方法是什么?

(请注意,我正在使用Visual Studio 2008和Boost 1.39。)

2 个答案:

答案 0 :(得分:6)

在C ++字符串上使用BOOST_FOREACH绝对正确(参见http://www.boost.org/doc/libs/1_39_0/doc/html/foreach.html#foreach.introduction) 看起来像

中的问题
  
// Do something with ch

答案 1 :(得分:2)

您应该向我们提供有关您的代码的更多信息,因为:

  • 您的问题与使用的VC ++运行时相关联
  • 正如Dmitriy明确回答的那样,你的问题很可能是由循环体引起的。

无论如何,通过你给我们的小信息,我可以推测以下内容:

  • 问题发生在调试而不是发布上的事实可能是因为调试检查发现错误,内存损坏等等。
  • 只有当你切换运行时才会发生这种事实,使用STL代码可能是混合来自不同模块的代码,每个模块都使用不同的运行时编译

当然,你对const字符串的迭代意味着什么都不应该被修改,但由于我无法重现你的错误(双关语),很难提供明确的答案。

如果您想了解更多信息,请向我们提供以下信息:

  • 字符串对象是否来自另一个模块(另一个DLL,另一个LIB,另一个EXE),可能是用另一个运行时编译的?
  • 如果您手动编写代码(使用普通的“for”),它是否有效?
  • 确切的错误消息是什么?