簡體   English   中英

為什么BOOST_FOREACH有時不能用C ++字符串工作?

[英]Why does BOOST_FOREACH not work sometimes with C++ strings?

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

在C ++字符串上使用BOOST_FOREACH絕對正確(參見http://www.boost.org/doc/libs/1_39_0/doc/html/foreach.html#foreach.introduction )。
看起來像是問題所在

  
// Do something with ch

您應該向我們提供有關您的代碼的更多信息,因為:

  • 您的問題與使用的VC ++運行時有關
  • 正如Dmitriy明確回答的那樣,你的問題很可能是由循環體引起的

無論如何,通過你給我們的小信息,我可以猜測以下內容:

  • 問題發生在調試而不是發布上的事實可能是因為調試檢查發現錯誤,內存損壞等等。
  • 它只在你切換運行時才會發生這種事實,使用STL代碼也許你正在混合來自不同模塊的代碼,每個模塊都使用不同的運行時編譯

當然,你在const字符串上進行迭代意味着什么都不應該被修改,但由於我無法重現你的錯誤(雙關語),很難提供明確的答案。

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

  • 字符串對象是否來自另一個模塊(另一個DLL,另一個LIB,另一個EXE),可能是用另一個運行時編譯的?
  • 如果您手動編寫代碼(使用普通的“for”),它是否有效?
  • 什么是確切的錯誤消息?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM