2016-08-14 207 views
1

我有一個真正的內存泄漏源於以下功能。std :: wstring_convert內存泄漏

// Convert a UTF-8-encoded byte string to a wstring. 
std::wstring Utf8ToWideString(const std::string& utf8str) { 
    std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> conv; 
    return conv.from_bytes(utf8str); 
} 

據我所知,設置特定的功能可能每個線程一次分配一些存儲器,並保持它的線程的生命週期或甚至整個過程(如顯然happens here)。這是不是我的情況;實際上,在這個過程中,我擁有大約2GB的額外內存,並且這些顯然泄露的堆塊中的大多數都有兩種大小之一,並且每個大小都包含一個星期的一天(...:Mon:Monday:Thu:...)和另一個一些時間格式。這些顯然是每次通話都泄漏。根據WPA(工具跟蹤分配,valgrind的Windows-land表親)的分配,發生在調用CRT功能std::setlocale的內部。另外,線程並不是很大,如果不是所有的轉換調用都來自同一個線程池,絕大多數線程都是絕對多數。

我的主要問題是:我正確使用std::wstring_convert

第二個問題,如果在我的代碼中沒有明顯的錯誤或不常見的模式,這是一個已知問題?我的編譯器是MSVS 2015,並且同時出現Update 2和Update 3版本的問題。

回答

2

根據http://en.cppreference.com/w/cpp/locale/wstring_convert,您使用std::wstring_convert似乎沒有任何問題。當然,這些設施應該適當地處理他們的記憶,而不需要用戶知道任何事情。

無論這是Visual Studio的標準庫實現中的錯誤,我都不知道。但是,我可以設想一種可能的情況是他們將轉換緩存爲某種形式的優化。要查看是否屬於這種情況,您應該嘗試重複轉換相同的字符串,並查看是否僅爲第一次轉換執行了分配。

最後一點,只要你沒有用完內存或使用過多的內存,我不會擔心它。雖然您可能想要執行「轉換壓力測試」,即執行多次分配,以查看內存使用量是否顯着增加。

+0

感謝您確認我的代碼片段的完整性。我一定會努力提出最低限度的複製;目前,這個問題發生在一個使用多達10個不同工具集的庫中的巨大服務器上。並且泄漏無疑是太重要了,無法成爲任何類型的緩存(我們正在談論每天處理的* GB內存)。 – kkm