当前位置: 首页 > 知识库问答 >
问题:

boost.filesystem create_directories抛出std::bad_alloc

宋洲
2023-03-14

我有一个Visual Studio 2008 C++03应用程序,使用在Windows XP SP3中运行的Boost 1.47.0。

调用boost::filesystem::create_directories(l“C:\\foo\\bar”);引发std::bad_alloc异常。

在“输出”窗口中,我看到一条调试堆消息:“heap[test.exe]:无效的分配大小-CDCDCDCE(超出7FFDEFFF)”

callstack显示boost.filesystem正在创建一个新的区域设置和Microsoft标准库文件xlocale第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    

编辑我更新到boost 1.50.0。问题依然存在。

共有1个答案

暴奕
2023-03-14

这个问题听起来像是_secure_scl中的不匹配(或者可能是有点相关的_has_iterator_debugging-但我怀疑后者,因为调用堆栈指示的是非调试构建)。有关详细信息,请参阅https://stackoverflow.com/A/6104239/12711,并确保_secure_scltest.exe和链接到的boost文件系统库的构建中的定义相同。

Faik,boost将使用VC默认值(即使在VS2008的版本构建中也是_secure_scl=1),因此如果您设置的是_secure_scl=0,这可能是问题所在。

 类似资料:
  • 问题内容: 我使用的是C ++ OpenCL包装程序,我想知道为什么我的程序崩溃了。我发现对的任何调用均引发错误。 程序输出: 这是的输出: –libdir=/usr/lib –libexecdir=/usr/lib –mandir=/usr/share/man –infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ –

  • 最近我开始在Grpc上工作。在Grpc C编译中,我发现以下错误,不确定是什么导致了这个问题。 我不是C语言背景,任何帮助都会对我很有用。 [主机]链接/home/test/grpc/bins/opt/grpc\u ruby\u插件[协议]从src/proto/grpc/channelz/channelz生成protobuf CC文件。proto[GRPC]从src/proto/GRPC/chan

  • 我试图找出以下代码中是否需要try-catch: 浏览C 1998标准,我能找到的唯一线索是第23.1节“集装箱要求”第8点,其中包含以下句子: 此参数的副本用于在每个容器对象的生存期内由这些构造函数和所有成员函数执行的任何内存分配。 我对此的解释是,容器中的任何成员函数都可以调用分配器,因此任何成员函数都可以抛出std::bad_alloc。是我过于偏执还是真的是这样?

  • 当我运行以下代码时, 抛出。但是,当我在另一个线程中设置Promission的值时, 一切正常。根据我对的理解,调用不应该抛出异常,除非promise没有共享状态(即它已从其中移动)或已经为其赋值,即使这样,它也会抛出,而不是。由于不存在数据竞争或任何类似的情况,因此无论我是从创建promise的线程还是在另一个线程中调用都不重要。是不是我漏了什么? 我使用g++和clang都尝试了这一点,结果是

  • 抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因

  • 问题内容: 我正在使用“ mvn install”编译一个开源项目,但最终结果为。我尝试执行,但输出为Java摘要,指示这是无效命令。 我正在使用,为什么会发生这种情况? 谢谢, 问题答案: 设置环境变量: