为什么BOOST#u FOREACH有时不能与C++;串? 我使用BooStIOrFACH迭代C++字符串的字符: void foobar(const string& str) { BOOST_FOREACH(const char ch, str) { // Do something with ch } return; }

为什么BOOST#u FOREACH有时不能与C++;串? 我使用BooStIOrFACH迭代C++字符串的字符: void foobar(const string& str) { BOOST_FOREACH(const char ch, str) { // Do something with ch } return; },c++,visual-studio,string,boost,C++,Visual Studio,String,Boost,这段代码适用于以下编译模式: 多线程(释放)(/MT) 多线程调试(/MTd) 多线程DLL(发布版)(/MD) 仅在此模式下会导致运行时错误(异常): 多线程调试DLL(发布版)(/MDd) 上面的代码片段没有编译错误或警告,这让我相信BOOST_FOREACH知道它在这里处理的容器。此外,将const char ch更改为const char&ch不会改变行为 为什么这段代码会导致这种不良的运行时行为 为什么只在调试DLL模式下 这是C++字符串上的BooStY-FrUEACH使用错

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

  • 多线程(释放)(/MT)
  • 多线程调试(/MTd)
  • 多线程DLL(发布版)(/MD)
仅在此模式下会导致运行时错误(异常):

  • 多线程调试DLL(发布版)(/MDd)
上面的代码片段没有编译错误或警告,这让我相信BOOST_FOREACH知道它在这里处理的容器。此外,将
const char ch
更改为
const char&ch
不会改变行为

为什么这段代码会导致这种不良的运行时行为

为什么只在调试DLL模式下

这是C++字符串上的BooStY-FrUEACH使用错误吗?< /P> 如果是,最好的解决方法是什么


(注意我正在使用VisualStudio 2008和Boost 1.39)。

< P> C++字符串上的BooStY-FuleAccess的用法是绝对正确的(参见)。 看来问题出在

  
// Do something with ch

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

  • 您的问题与使用的VC++运行时有关
  • 正如Dmitry明确回答的那样,您的问题很可能是由循环体引起的
总之,根据你给我们的一点信息,我可以推测如下:

  • 问题发生在调试时而不是发布时,可能是因为调试检查发现了错误、内存损坏等等
  • 只有在切换运行时(使用STL代码)时才会发生这种情况,这可能是因为您混合了来自不同模块的代码,每个模块使用不同的运行时编译
当然,您在const字符串上的迭代意味着不应该修改任何内容,但由于我无法重现您的bug(双关语),因此很难给出明确的答案

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

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

请提供更详细的信息,说明您遇到了什么样的异常/错误,以及在什么情况下出现的异常/错误。还有预处理器输出。以及一个完整的最小测试用例,用于重现问题。事实上,如果您能得到一个可测试的程序,我们中的许多人都可以在这些配置下进行测试。我复制粘贴了您给我们的代码,它在所有情况下都很有效,包括/MDd…^ ^ ^+1因为:1。这句话使我发笑。2.这句话很可能是真的。