C++ boost::iostreams::映射的\u文件\u接收器引发未知异常

C++ boost::iostreams::映射的\u文件\u接收器引发未知异常,c++,linux,exception,boost,memory-mapped-files,C++,Linux,Exception,Boost,Memory Mapped Files,你们能帮我解决由boost::iostreams::mapped\u file\u sink引发的未知异常吗 我的配置 增压1.51 Windows 7上的Visual Studio 2012 Ubuntu上的GCC4.7 这是我的密码 try { boost::iostreams::mapped_file_params params_; boost::iostreams::mapped_file_sink sink_; params_.length = 0;

你们能帮我解决由
boost::iostreams::mapped\u file\u sink
引发的未知异常吗

我的配置

  • 增压1.51
  • Windows 7上的Visual Studio 2012
  • Ubuntu上的GCC4.7
这是我的密码

try
{
    boost::iostreams::mapped_file_params params_;
    boost::iostreams::mapped_file_sink sink_;
    params_.length = 0;
    params_.new_file_size = 1024;
    params_.path = "./test.bin";
    sink_.open(params_);
    sink_.close();
}
catch (std::ios::failure& ex)
{
    std::cout << "\t" << "what: " << ex.what() << "\n";
}
catch (std::system_error& ex)
{
    std::cout << "\t" << "code: " << ex.code() << "  what: " << ex.what() << "\n";
}
catch (std::runtime_error& ex)
{
    std::cout << "\t" << ex.what() << "\n";
}
catch (boost::archive::archive_exception& ex)
{
    std::cout << "\t" << ex.what() << "\n";
}
catch (boost::exception& ex)
{
    std::cout << "blah\n";
}
catch (std::exception& ex)
{
    std::cout << "\t" << ex.what() << " --- " << typeid(ex).name() << "\n";
}
根据谷歌的说法,这意味着:
boost::exception\u detail::clone\u impl


有什么问题吗?

您可以在调试器中运行代码,并在函数中设置一个实际引发异常的断点,例如,
\ucxa\u throw
。系统上的函数名称可能不同:使用
nm-po程序| less
并搜索包含
throw
的函数。在最有可能由系统创建的断点中设置断点。如果抛出的异常很少,您还可以在
std::exception::exception()

中设置断点。经过50分钟的猜测,我发现问题出在
length
字段中。文档中没有这样说,但是它的默认值必须是源代码中规定的-1

BOOST_STATIC_CONSTANT(size_type, max_length = static_cast<size_type>(-1));
BOOST_STATIC_常量(size_类型,max_length=STATIC_cast(-1));

我直觉地认为,如果我将
new\u file\u size
设置为大于零,它将忽略
length

谢谢你的提示!我不太熟悉Linux工具,因为我是在VisualStudio中开发的。
BOOST_STATIC_CONSTANT(size_type, max_length = static_cast<size_type>(-1));