std::map::insert(...) 中的分段错误 [英] Segmentation fault in std::map::insert(...)

查看:42
本文介绍了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;
};

以及我如何使用它:

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

我曾尝试先使用 std::map::find(...),但结果相同.回溯:

i've tried to use std::map::find(...) first, but i have same result. 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)

我认为段错误的原因是参数__y=@0x758948f87d894905.我不知道这是为什么!在那一刻 m_votes 地图是空的.请给我建议...

i suppose the reason of segfault is argument __y=@0x758948f87d894905. i have no idea why this is! at that moment m_votes map is empty. please, suggest me...

正如 Matthieu M. 所说,最可能的原因是未初始化的值 __y=@0x758948f87d894905,但 __y 的类型为 order_id_t 但不是 <代码>投票

As Matthieu M. says the most probable reason is uninitialized value __y=@0x758948f87d894905, but __y has type of order_id_t but not Vote

我试图重写代码:

std::map<int, int> m_votes;

这并没有解决我的问题,因此,问题不在于我的类型......

and this didn't solve my problem, therefore, the problem isn't in my types...

这是调用 registerVote() 方法的代码.

here is the code invoking registerVote() method.

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

昨天,我发现问题不在我的代码中!我已经将 std::map 替换为其他 stl 结构,但结果是一样的!我已经从该代码中删除了 stl 并且段错误在 Vote 构造函数中,我已经删除了这个类并且段错误在我代码的其他 stl 结构中!那是什么?请帮帮我.

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! 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! 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.

如前所述:this=0x407a59, __x=@0x7fffffff0b50, __y=@0x758948f87d894905 很奇怪,地址相距太远,所以我们可以假设其中一个(至少)是只是未初始化.为了我自己的理智,我假设您对 std::map 的实现没有问题.

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. And for my own sanity I'll suppose that your implementation of std::map is not buggy.

我的直觉是寻找一个未初始化的地图,因此,和未初始化的 VoteContainer 对象.您是否有一些 VoteContainer* 在调用 registerVote 之前忘记分配?

My gut feeling would be to look for an uninitialized map, and therefore, and uninitialized VoteContainer object. Would you have some VoteContainer* that you forgot to allocate before invoking registerVote on it ?

这篇关于std::map::insert(...) 中的分段错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆