2009-08-14 40 views
2

我使用BOOST_FOREACH通過C++串這樣的字符進行迭代:爲什麼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模式下?

BOOST_FOREACH在C++字符串上的這種用法是錯誤的嗎?

如果是,那麼最好的解決方法是什麼?

(請注意,我用Visual Studio 2008的工作和Boost 1.39)。BOOST_FOREACH對C++字符串

+1

請給什麼樣的異常/錯誤,你得到的,並且在這一點更詳細的信息。 – 2009-08-14 03:06:33

+0

還有預處理器輸出。 – stepancheg 2009-08-14 03:07:42

+2

和一個完整的最小化測試用例,可以重現問題。 – stepancheg 2009-08-14 03:08:12

回答

2

你應該給我們介紹一下你的代碼的詳細信息,這是因爲:

  • 你的問題與使用
  • 作爲顯然由德米特里回答VC++運行時捆綁,你的問題是最有可能被循環體造成

。不管怎麼樣,你給我們的一點信息,我可以specu晚了以下:

  • 問題發生在調試而不是發佈的事實可能是因爲調試檢查發現錯誤,內存損壞,無論如何。
  • 它,只有當你切換運行時,與STL代碼發生的事實是,從不同的模塊或許你混合代碼,每一個具有不同的運行時編譯

當然,事實上你迭代一個常量字符串意味着什麼都不應該被修改,但是由於我無法複製你的bug(雙關語意圖),所以很難提供明確的答案。

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

  • 是從另一個模塊來的字符串對象(另一個DLL,另一個LIB,另一個EXE),可能與另一個運行時編譯?
  • 如果你手工編寫代碼(使用一個普通的老「爲」),它的工作原理?
  • 什麼是確切的錯誤信息?
相關問題