2010-12-21 86 views
3

我偶爾會從boost :: lower獲得奇怪的行爲,當調用std :: wstring時。特別是,我已經看到了以下斷言在發佈版本失敗(但不調試版本):什麼導致boost :: lower會失敗is_singular斷言?

Assertion failed: !is_singular(), file C:\boost_1_40_0\boost/range/iterator_range.hpp, line 281 

我還看到了什麼叫出現的boost :: to_lower在上下文之後是內存錯誤如:

void test(const wchar_t* word) { 
    std::wstring buf(word); 
    boost::to_lower(buf); 
    ... 
} 

更換boost::tolower(wstr)std::transform(wstr.begin(), wstr.end(), wstr.begin(), towlower)出現來解決這個問題的呼叫;但我想知道發生了什麼問題。

我最好的猜測是,也許這個問題與更改Unicode字符的情況有關 - 也許編碼大小的downcased字符是不同於源字符的編碼大小?

有沒有人有任何想法可能會發生在這裏?如果我知道「is_singular()」在提升的背景下意味着什麼,可能會有所幫助,但是在執行一些谷歌搜索之後,我無法找到任何文檔。

相關軟件版本:Boost 1.40.0; MS Visual Studio 2008.

回答

3

經過進一步調試,我找出了發生了什麼事。

我的麻煩原因是解決方案中的一個項目沒有定義NDEBUG(儘管處於發佈模式),而所有其他模塊都是。 Boost在其數據結構中分配一些額外的字段,用於存儲調試信息(例如數據結構是否已初始化)。如果模塊A調試關閉,那麼它將創建不包含這些字段的數據結構。然後,當開啓了調試功能的模塊B掌握了該數據結構之後,它將嘗試檢查這些字段(未分配),導致隨機存儲器錯誤。

定義NDEBUG在全部項目中的解決方案解決了這個問題。

3

如果默認構造函數構造了迭代器範圍(存儲單數迭代器,即不表示範圍),則迭代器範圍應該是單數。由於很難相信該提升的功能可以創建一個單獨的範圍,它表明這個問題也可能在其他地方(由於某些未定義的行爲,例如使用未初始化的變量,這些變量可能被初始化爲調試中的某個已知值編譯)。

瞭解更多關於Heisenbugs

相關問題