C++ std::map::insert(…)中的分段错误

C++ std::map::insert(…)中的分段错误,c++,stl,stdmap,segmentation-fault,C++,Stl,Stdmap,Segmentation Fault,我用过搜索,但我没有找到令我满意的答案。。。所以这是一段代码: //VoteContainer.h typedef uint32_t order_id_t; typedef int driver_id_t; class Vote { public: enum DriverVoteResponse {YES, NO, TIMEOUT}; struct DriverResponse {

我用过搜索,但我没有找到令我满意的答案。。。所以这是一段代码:

 //VoteContainer.h    
    typedef uint32_t order_id_t;
    typedef int driver_id_t;

    class Vote {

        public:
            enum DriverVoteResponse {YES, NO, TIMEOUT};

            struct DriverResponse {
                driver_id_t driver_id;
                time_t time;
                DriverVoteResponse response;
            };

            Vote() : m_order_id(0), m_time_until(0) {};
            Vote(order_id_t inOrderId, std::vector<driver_id_t> inPermittedDrivers, int inSeconds);
            Vote(const Vote & other) : m_order_id(other.m_order_id), m_time_until(other.m_order_id) {
                m_drivers_responses = other.m_drivers_responses;
                m_permitted_drivers = other.m_permitted_drivers;
            };

            virtual ~Vote() {};

            virtual void addDriverVote(driver_id_t inDriverId, DriverVoteResponse inDriverResponse);
            virtual void getAppropriateDriverId(driver_id_t * inDriverId); //with min response time

        private:

            order_id_t m_order_id;
            time_t m_time_until;
            std::vector<DriverResponse> m_drivers_responses;
            std::vector<driver_id_t> m_permitted_drivers;
        };

class VoteContainer {
public:

    VoteContainer() {};
    virtual ~VoteContainer() {};

    void registerVote(order_id_t inOrderId, std::vector<driver_id_t> inPermittedDrivers, int inSeconds);

private:
    std::map<order_id_t, Vote> m_votes;
};
我尝试先使用std::map::find(…),但结果相同。回溯:

#0 0x41096a std::less<unsigned int>::operator() (this=0x407a59, __x=@0x7fffffff0b50, __y=@0x758948f87d894905) (/usr/include/c++/4.4/bits/stl_function.h:230)
#1 0x4105fb std::_Rb_tree<unsigned int, std::pair<unsigned int const, Vote>, std::_Select1st<std::pair<unsigned int const, Vote> >, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, Vote> > >::_M_insert_unique(this=0x407a59, __v=...) (/usr/include/c++/4.4/bits/stl_tree.h:1170)
#2 0x40fb25 std::map<unsigned int, Vote, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, Vote> > >::insert(this=0x407a59, __x=...) (/usr/include/c++/4.4/bits/stl_map.h:500)
#3 0x40f06f VoteContainer::registerVote(this=0x407a51, inOrderId=1, inPermittedDrivers=..., inSeconds=32) (/home/user/workspace/src/merit_your_name/VoteContainer.cpp:81)
这并没有解决我的问题,因此,问题不在我的类型中

下面是调用
registerNote()
方法的代码

void OrderProcessor::processOrder(Order inOrder) {
    //test!!!
    driver_id_t driver_ids[] = {1,2};
    std::vector<driver_id_t> drivers(driver_ids, driver_ids + sizeof(driver_ids) / sizeof(driver_id_t) );

    m_vote_container->registerVote(inOrder.getId(), drivers, 32);

    for(size_t i = 0; i < drivers.size(); i++) {
        std::cout << "sending vote to " << drivers[i] << " driver. " << std::endl;
        std::cout << "send returns " << Arch::send_to_socket_nonblock((*m_drivers_connections)[drivers[i]], "<vote>1</vote>") << std::endl;
    }

    sleep(32);

    Vote vote = m_vote_container->getVote(inOrder.getId());
    vote.getAppropriateDriverId(driver_id);
    m_vote_container->deleteVote(inOrder.getId());
};
void OrderProcessor::processOrder(Order-inoorder){
//测试!!!
驱动程序id\u t驱动程序id[]={1,2};
标准::矢量驱动程序(驱动程序id,驱动程序id+sizeof(驱动程序id)/sizeof(驱动程序id));
m_vote_container->registerNote(inOrder.getId(),drivers,32);
对于(size_t i=0;istd::cout如果您在Linux下工作,我可以推荐valgrind工具,它应该可以帮助您找到问题所在

从我所看到的,我敢说真正重要的代码缺失了

如前所述:
this=0x407a59,\uuux=@0x7fffff0b50,\uuu y=@0x758948f87d894905
非常奇怪,地址相距太远,所以我们可以假设其中一个(至少)是未初始化的。为了我自己的理智,我假设您的
std::map
实现没有问题

我的直觉是寻找一个未初始化的映射,因此也是一个未初始化的
VoteContainer
对象。你会有一些
VoteContainer*
在调用
registerNote
之前忘记分配的对象吗?

两个猜测:

  • 您能否显示调用
    registerNote()
    方法的代码?(我想这可能会提供一些线索。)

  • 你能把

    m_投票。清除()


  • VoteContainer
    constructor?

    中,我想valgrind会像调用堆栈那样指向“#0 0x41096a std::less::operator()(this=0x407a59,uuuuuuuu x=@0x7fffff0b50,uu y=@0x758948f87d894905)”。但我会尝试+1,或者是一个已经销毁的
    VoteContainer
    (您是否将指针保留在自动
    VoteContainers
    中?是否删除了
    VoteContainer
    并尝试稍后使用该指针?)
    VoteContainer
    不能取消初始化,因为它首先初始化。我没有动态分配
    VoteContainer
    ,而是在程序开始时静态分配。它首先是程序的多线程部分,但我以单线程方式重写,所以所有对象都必须存在。m\u vots.clear()没有解决问题…我想问题不在我的代码中,我可以尝试做什么?
    #0 0x41096a std::less<unsigned int>::operator() (this=0x407a59, __x=@0x7fffffff0b50, __y=@0x758948f87d894905) (/usr/include/c++/4.4/bits/stl_function.h:230)
    #1 0x4105fb std::_Rb_tree<unsigned int, std::pair<unsigned int const, Vote>, std::_Select1st<std::pair<unsigned int const, Vote> >, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, Vote> > >::_M_insert_unique(this=0x407a59, __v=...) (/usr/include/c++/4.4/bits/stl_tree.h:1170)
    #2 0x40fb25 std::map<unsigned int, Vote, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, Vote> > >::insert(this=0x407a59, __x=...) (/usr/include/c++/4.4/bits/stl_map.h:500)
    #3 0x40f06f VoteContainer::registerVote(this=0x407a51, inOrderId=1, inPermittedDrivers=..., inSeconds=32) (/home/user/workspace/src/merit_your_name/VoteContainer.cpp:81)
    
    std::map<int, int> m_votes;
    
    void OrderProcessor::processOrder(Order inOrder) {
        //test!!!
        driver_id_t driver_ids[] = {1,2};
        std::vector<driver_id_t> drivers(driver_ids, driver_ids + sizeof(driver_ids) / sizeof(driver_id_t) );
    
        m_vote_container->registerVote(inOrder.getId(), drivers, 32);
    
        for(size_t i = 0; i < drivers.size(); i++) {
            std::cout << "sending vote to " << drivers[i] << " driver. " << std::endl;
            std::cout << "send returns " << Arch::send_to_socket_nonblock((*m_drivers_connections)[drivers[i]], "<vote>1</vote>") << std::endl;
        }
    
        sleep(32);
    
        Vote vote = m_vote_container->getVote(inOrder.getId());
        vote.getAppropriateDriverId(driver_id);
        m_vote_container->deleteVote(inOrder.getId());
    };