【问题标题】:Why does BOOST_FOREACH not work sometimes with C++ strings?为什么 BOOST_FOREACH 有时不适用于 C++ 字符串?
【发布时间】:2010-11-19 12:54:13
【问题描述】:

我正在使用 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)

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

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

为什么只在 Debug DLL 模式下?

在 C++ 字符串上使用 BOOST_FOREACH 是否错误?

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

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

【问题讨论】:

  • 请提供更详细的信息,说明您在什么时候遇到了哪些异常/错误。
  • 还有预处理器输出。
  • 以及重现问题的完整最小测试用例。
  • 确实,如果你能得到一个可测试的程序,我们中的许多人都可以在这些配置下进行测试。
  • 我复制粘贴了你给我们的代码,它在所有情况下都运行良好,包括 /MDd ... ^_^ ...

标签: c++ visual-studio string boost


【解决方案1】:

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

中的问题
  
// Do something with ch

【讨论】:

  • +1 因为: 1. 这句话让我发笑。 2. 这句话很可能是真的。
【解决方案2】:

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

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

无论如何,根据您提供给我们的少量信息,我可以推测以下内容:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2019-03-06
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多