简体   繁体   English

std :: map :: insert(...)中的分段错误

[英]Segmentation fault in std::map::insert(…)

i've used search but i didn't find answer satisfying me... so.. this is chunk of code: 我用过搜索但是我找不到满足我的答案...所以......这是一大堆代码:

 //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;
};

and how i use it: 以及我如何使用它:

//VoteContainer.cpp
void VoteContainer::registerVote(order_id_t inOrderId, std::vector<driver_id_t> inPermittedDrivers, int inSeconds) {
        m_votes.insert(std::make_pair(inOrderId,  Vote(inOrderId, inPermittedDrivers, inSeconds)));
    return;
};

i have segfault in regardless of what i do: 无论我做什么,我都有段错误:

m_votes.insert(std::make_pair(inOrderId,  Vote(inOrderId, inPermittedDrivers, inSeconds)));

i've tried to use std::map::find(...) first, but i have same result. 我首先尝试使用std :: map :: find(...),但我有相同的结果。 backtrace: 回溯:

#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)

i suppose the reason of segfault is argument __y=@0x758948f87d894905 . 我认为segfault的原因是参数__y=@0x758948f87d894905 i have no idea why this is! 我不知道为什么会这样! at that moment m_votes map is empty. 那一刻m_votes地图是空的。 please, suggest me... 拜托,建议我......

As Matthieu M. says the most probable reason is uninitialized value __y=@0x758948f87d894905 , but __y has type of order_id_t but not Vote 正如Matthieu M.所说,最可能的原因是未初始化的值__y=@0x758948f87d894905 ,但__y类型为order_id_t但不是Vote

i've tried to rewrite code : 我试图重写代码:

std::map<int, int> m_votes;

and this didn't solve my problem, therefore, the problem isn't in my types... 这并没有解决我的问题,因此,问题不在于我的类型......

here is the code invoking registerVote() method. 这是调用registerVote()方法的代码。

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());
};

Yesterday,i found out there is problem not in my code! 昨天,我发现我的代码中没有问题! i've replaced std::map to other stl structures but the result was the same! 我已经将std :: map替换为其他stl结构,但结果是一样的! i've deleted stl from that code and segfault was in Vote constructor, i've deleted this class and segfault was in other stl structures of my code! 我已经从该代码中删除了stl并且segfault在Vote构造函数中,我已经删除了这个类,并且segfault在我的代码的其他stl结构中! what is that? 那是什么? help me please. 请帮帮我。

i've found out the reason of my problem, that isn't this code. 我发现了我的问题的原因,这不是这个代码。 problem was in my previous code. 问题出在我以前的代码中。 thank you all for participating this discussion. 谢谢大家参与这次讨论。

From what I can see, I would venture that the really important code is missing. 从我所看到的,我冒昧地认为真正重要的代码缺失了。

As noted: this=0x407a59, __x=@0x7fffffff0b50, __y=@0x758948f87d894905 is quite strange, the addresses are way too apart, so we can suppose that one of them (at least) is simply uninitialized. 如上所述: this=0x407a59, __x=@0x7fffffff0b50, __y=@0x758948f87d894905非常奇怪,地址相距太远,所以我们可以假设其中一个(至少)是未初始化的。 And for my own sanity I'll suppose that your implementation of std::map is not buggy. 为了我自己的理智,我认为你的std::map实现并不是错误的。

My gut feeling would be to look for an uninitialized map, and therefore, and uninitialized VoteContainer object. 我的直觉是寻找未初始化的地图,因此,未初始化的VoteContainer对象。 Would you have some VoteContainer* that you forgot to allocate before invoking registerVote on it ? 在调用registerVote之前,你有没有忘记分配的VoteContainer*

如果您在Linux下工作,我可以推荐valgrind工具,它应该可以帮助您找到问题所在

Two guesses: 两个猜测:

  1. Can you show the code calling the registerVote() method? 你能展示调用registerVote()方法的代码吗? (I suspect that may give some clue.) (我怀疑这可能会给人一些线索。)

  2. Can you put 你能放吗?

    m_votes.clear(); m_votes.clear();

in the VoteContainer constructor? VoteContainer构造函数中?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM