Привет всем.
Мне тут пользователь заслал дамп с падением его программы из-за моего модуля.
| | Стек падения |
| | ucrtbase.dll!__acrt_release_locale_ref() Unknown Non-user code. Symbols loaded.
ucrtbase.dll!_updatetlocinfoEx_nolock() Unknown Non-user code. Symbols loaded.
ucrtbase.dll!__acrt_update_thread_locale_data() Unknown Non-user code. Symbols loaded.
ucrtbase.dll!_wsetlocale() Unknown Non-user code. Symbols loaded.
ucrtbase.dll!call_wsetlocale() Unknown Non-user code. Symbols loaded.
ucrtbase.dll!setlocale() Unknown Non-user code. Symbols loaded.
msvcp140.dll!std::_Locinfo::_Locinfo_ctor(std::_Locinfo * pLocinfo, int cat, const char * locname) Line 149 C++ Non-user code. Symbols loaded.
msvcp140.dll!std::_Locinfo::_Locinfo(int _Cat, const char * _Pch) Line 90 C++ Non-user code. Symbols loaded.
MyModule.dll!std::locale::_Construct(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & _Str, int) Line 368 C++ Non-user code. Symbols loaded.
MyModule.dll!std::locale::locale(const char *) Line 400 C++ Non-user code. Symbols loaded.
>[Inline Frame] MyModule.dll!structure::t_char_lower<wchar_t>::{ctor}(const char * const) Line 270 C++ Symbols loaded.
|
| | |
Говорит, исходя из опыта, проблема в многопоточном вызове ucrtbase.dll!setlocale(). И приводит пару ссылок с подобными проблемами:
https://connect.microsoft.com/VisualStudio/feedback/details/790530/crt-function-setlocale-imp-setlocale-crashes-with-multithreaded-applications
https://connect.microsoft.com/VisualStudio/feedback/details/794122
У меня этот setlocale не вызывается. Я юзаю std::locale("C").
Я уже огребал проблемы с этим std::locale в многопоточном коде (VS2005-VS2010) — он там внутри юзал MT-блокировку, которая многопоточный код
ставит раком делает однопоточным.
В критических местах я эту проблему решил (задействую глобальные объекты этого класса, которые создаются при инициализации модуля).
А в других местах оставил как есть (создаю локальный объект std::locale и юзаю его). Как раз в таком месте оно и упало.
---
Интересно, они в VS2015-ой что, ту MT-блокировку изничтожили, из-за которой у меня раньше все тупило? Или оно не падало потому что везло?
С другой стороны пока глобальные объекты не были задействован, почему оно не падало?
---
Есть конечно вариант, что кто-то нагадил в память.
Но больше склоняюсь к тому, что трабла именно с std::locale.
Сам я решил изничтожить использование std::locale в своем коде.
Но интересно узнать мнение других.
---
Спасибо, что дочитали этот поток сознания до конца.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --