Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::property_tree::read_xml segfaults在使用boost::asio::spawn生成的asio处理程序中_C++_Boost_Boost Asio_Boost Propertytree - Fatal编程技术网

C++ boost::property_tree::read_xml segfaults在使用boost::asio::spawn生成的asio处理程序中

C++ boost::property_tree::read_xml segfaults在使用boost::asio::spawn生成的asio处理程序中,c++,boost,boost-asio,boost-propertytree,C++,Boost,Boost Asio,Boost Propertytree,以下代码在boost::property_tree::read_xml调用中因seg错误而崩溃。 只有在使用boost::asio::spawn生成的io_服务处理程序内部调用它时,才会发生这种情况。如果处理程序刚刚发布,那么它工作正常。 是否有修复或解决方法? 增加1.61 #include <boost/asio/spawn.hpp> #include <boost/property_tree/ptree.hpp> #include <boost/propert

以下代码在boost::property_tree::read_xml调用中因seg错误而崩溃。 只有在使用boost::asio::spawn生成的io_服务处理程序内部调用它时,才会发生这种情况。如果处理程序刚刚发布,那么它工作正常。 是否有修复或解决方法? 增加1.61

#include <boost/asio/spawn.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <iostream>
#include <sstream>
#include <thread>

void process()
{
    std::cerr << "start"<< std::endl;
    std::istringstream is("<t>1</t>");
    boost::property_tree::ptree pt;
    boost::property_tree::read_xml(is, pt); // <<< seg fault here
    std::cerr << std::endl << "end" << std::endl;
}

int main()
{
    boost::asio::io_service io_service;
    boost::asio::spawn(io_service, [] (boost::asio::yield_context y){
        process();
    });
    io_service.run();
    return 0;
}

经过一番挖掘,我们发现seg故障是由coroutine的堆栈溢出引起的,因为boost::property_tree::read_xml中使用的rapidxml解析器默认为每个xml文档中的静态内存池在堆栈上分配64KB

解决方案是按如下方式减小池的大小:

#define BOOST_PROPERTY_TREE_RAPIDXML_STATIC_POOL_SIZE 512
#include <boost/property_tree/xml_parser.hpp>
另一个解决方案是增加协程的堆栈大小