问题
I have a Visual Studio 2008 C++03 application using Boost 1.47.0 running in Windows XP SP3.
The call boost::filesystem::create_directories( L"c:\\foo\\bar" );
throws a std::bad_alloc
exception.
In the output window, I see a debug heap message: "HEAP[test.exe]: Invalid allocation size - CDCDCDCE (exceeded 7ffdefff)"
The callstack shows boost.filesystem creating a new locale and last visible line of code in the Microsoft standard library file xlocale line 309.
msvcp90.dll!std::_Allocate<char>() + 0x17 bytes
msvcp90.dll!std::allocator<char>::allocate() + 0xf bytes
msvcp90.dll!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Copy() + 0x70 bytes
msvcp90.dll!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Grow() + 0x26 bytes
msvcp90.dll!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign() + 0x50 bytes
msvcp90.dll!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> >() + 0x24 bytes
msvcp90.dll!std::locale::_Locimp::_Locimp() + 0x47 bytes
> test.exe!std::locale::locale<windows_file_codecvt>(const std::locale & _Loc={...}, const windows_file_codecvt * _Facptr=0x00b48f60) Line 309 + 0x69 bytes C++
test.exe!`anonymous namespace'::default_locale() Line 735 C++
test.exe!`anonymous namespace'::path_locale() Line 777 + 0x2a bytes C++
test.exe!boost::filesystem3::path::wchar_t_codecvt_facet() Line 797 + 0x25 bytes C++
test.exe!boost::filesystem3::path::codecvt() Line 388 + 0x5 bytes C++
test.exe!boost::filesystem3::path::path<wchar_t const *>(const wchar_t * begin=0x00b460f8, const wchar_t * end=0x00b46116) Line 162 + 0x5 bytes C++
test.exe!boost::filesystem3::path::parent_path() Line 313 + 0x57 bytes C++
test.exe!boost::filesystem3::detail::create_directories(const boost::filesystem3::path & p={...}, boost::system::error_code * ec=0x00000000) Line 832 + 0x13 bytes C++
test.exe!boost::filesystem3::create_directories(const boost::filesystem3::path & p={...}) Line 318 + 0x29 bytes C++
test.exe!wmain(int __formal=1, int __formal=1) Line 112 + 0xc bytes C++
test.exe!__tmainCRTStartup() Line 583 + 0x19 bytes C
test.exe!wmainCRTStartup() Line 403 C
kernel32.dll!_BaseProcessStart@4() + 0x23 bytes
Can anybody suggest how to fix this issue?
EDIT I updated to boost 1.50.0. The issue remains.
回答1:
This problem smells like a mismatch in _SECURE_SCL
(or maybe the somewhat related _HAS_ITERATOR_DEBUGGING
- but I doubt the latter, since the call stack indicates a non-debug build). See https://stackoverflow.com/a/6104239/12711 for some info and make sure _SECURE_SCL
is defined the same way in the builds for test.exe
and the boost filesystem library linked in.
AFAIK, boost will use the VC default (which is _SECURE_SCL=1
even in release builds for VS2008), so if you're setting _SECURE_SCL=0
that may be the problem.
回答2:
This seems to be a known bug in Microsoft's implementation of std::locale
when running a DEBUG build. It was reported June 2012.
The message you get regarding memory address CDCDCDCE implies accessing deleted memory, as this bug describes.
There is no solution currently described in Microsoft's site, but I would suggest trying a different facet by changing L"c:\\foo\\bar"
to "c:\\foo\\bar"
.
来源:https://stackoverflow.com/questions/12186955/boost-filesystem-create-directories-throws-stdbad-alloc