为什么BOOST_FOREACH不能与C ++字符串有时工作?(Why does BOOST_FOR

2019-09-23 15:14发布

我使用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 chconst char& ch在行为没有变化。

为什么这个代码导致此不良运行时行为?

为什么只有在调试DLL模式?

是C ++字符串这种用法BOOST_FOREACH错了吗?

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

(请注意,我用Visual Studio 2008的工作和Boost 1.39)。

Answer 1:

在C ++字符串BOOST_FOREACH的使用是绝对正确的(见http://www.boost.org/doc/libs/1_39_0/doc/html/foreach.html#foreach.introduction )。
貌似问题

  
// Do something with ch


Answer 2:

你应该给我们更多的信息,关于你的代码,这是因为:

  • 你的问题是并列使用VC ++运行时
  • 正如德米特里说白了回答,你的问题是最有可能被循环体引起的

总之,与小信息你给了我们,我可以推测如下:

  • 在调试而不是释放问题发生的事实是,也许是因为一个调试检查时发现错误,内存损坏,等等。
  • 它只有当你切换运行时,与STL代码发生的事实是,从不同的模块或许你混合代码,每一个具有不同的运行时编译

当然,事实上你迭代一个常量字符串没有任何意义应该得到修改,但我无法重现你的错误(双关语意),所以很难提供一个确切的答案。

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

  • 是字符串对象从另一个模块(另一个DLL,另一个LIB,另一个EXE)的到来,可能与另一个运行时编译?
  • 如果你手工编写代码(使用一个普通的老“为”),它的工作原理?
  • 什么是确切的错误信息?


文章来源: Why does BOOST_FOREACH not work sometimes with C++ strings?