Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

boost.filesystem create_directories throws std::bad_alloc

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.

like image 707
PaulH Avatar asked Nov 03 '22 17:11

PaulH


1 Answers

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".

like image 187
Drew Dormann Avatar answered Nov 11 '22 22:11

Drew Dormann