6

私は検索を使用しましたが、満足のいく答えが見つかりませんでした...だから..これはコードのチャンクです:

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

セグメンテーション違反の理由は引数だと思います__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構造にありました。それは何ですか?お願い助けて。

私は私の問題の理由を見つけました、それはこのコードではありません。問題は私の前のコードにありました。このディスカッションに参加していただき、ありがとうございます。

4

3 に答える 3

5

私が見ることができることから、私は本当に重要なコードが欠落していることを思い切って思います。

前述のようthis=0x407a59, __x=@0x7fffffff0b50, __y=@0x758948f87d894905に、非常に奇妙なことですが、アドレスが離れすぎているため、そのうちの1つ(少なくとも)が単純に初期化されていないと推測できます。そして、私自身の正気のために、あなたの実装std::mapはバグがないと思います。

私の直感は、初期化されていないマップ、つまり初期化されていないオブジェクトを探すことVoteContainerです。VoteContainer*呼び出す前に割り当てるのを忘れたものがありますregisterVoteか?

于 2010-09-02T07:01:13.360 に答える
1

Linuxで作業している場合は、valgrindツールをお勧めします。問題がどこにあるかを見つけるのに役立ちます。

于 2010-09-02T06:47:26.857 に答える
0

2つの推測:

  1. メソッドを呼び出すコードを表示できますregisterVote()か?(私はそれがいくつかの手がかりを与えるかもしれないと思う。)

  2. 入れてもらえますか

    m_votes.clear();

VoteContainerコンストラクターで?

于 2010-09-02T14:18:27.370 に答える