簡體   English   中英

std :: map :: insert(...)中的分段錯誤

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

我用過搜索但是我找不到滿足我的答案...所以......這是一大堆代碼:

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

無論我做什么,我都有段錯誤:

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

我首先嘗試使用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)

我認為segfault的原因是參數__y=@0x758948f87d894905 我不知道為什么會這樣! 那一刻m_votes地圖是空的。 拜托,建議我......

正如Matthieu M.所說,最可能的原因是未初始化的值__y=@0x758948f87d894905 ,但__y類型為order_id_t但不是Vote

我試圖重寫代碼:

std::map<int, int> m_votes;

這並沒有解決我的問題,因此,問題不在於我的類型......

這是調用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());
};

昨天,我發現我的代碼中沒有問題! 我已經將std :: map替換為其他stl結構,但結果是一樣的! 我已經從該代碼中刪除了stl並且segfault在Vote構造函數中,我已經刪除了這個類,並且segfault在我的代碼的其他stl結構中! 那是什么? 請幫幫我。

我發現了我的問題的原因,這不是這個代碼。 問題出在我以前的代碼中。 謝謝大家參與這次討論。

從我所看到的,我冒昧地認為真正重要的代碼缺失了。

如上所述: this=0x407a59, __x=@0x7fffffff0b50, __y=@0x758948f87d894905非常奇怪,地址相距太遠,所以我們可以假設其中一個(至少)是未初始化的。 為了我自己的理智,我認為你的std::map實現並不是錯誤的。

我的直覺是尋找未初始化的地圖,因此,未初始化的VoteContainer對象。 在調用registerVote之前,你有沒有忘記分配的VoteContainer*

如果您在Linux下工作,我可以推薦valgrind工具,它應該可以幫助您找到問題所在

兩個猜測:

  1. 你能展示調用registerVote()方法的代碼嗎? (我懷疑這可能會給人一些線索。)

  2. 你能放嗎?

    m_votes.clear();

VoteContainer構造函數中?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM