std :: map :: insert(…)のセグメンテーション障害
-
26-09-2019 - |
質問
私は検索を使用しましたが、私は私を満足させる答えを見つけませんでした...だから..これはコードの塊です:
//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;
};
私は自分が何をしているかに関係なく、segfaultを持っています:
m_votes.insert(std::make_pair(inOrderId, Vote(inOrderId, inPermittedDrivers, inSeconds)));
最初に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)
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は投票コンストラクターにありました、私はこのクラスを削除し、セグフォーは私のコードの他のSTL構造にありました!それは何ですか?お願い助けて。
私の問題の理由を見つけました。それはこのコードではありません。問題は私の以前のコードにありました。この議論に参加してくれてありがとう。
解決
私が見ることができるものから、私は本当に重要なコードが欠落していることを冒険します。
述べたように: this=0x407a59, __x=@0x7fffffff0b50, __y=@0x758948f87d894905
非常に奇妙で、アドレスはあまりにも離れているので、そのうちの1つ(少なくとも)が単に非初期化されていないと仮定することができます。そして私自身の正気のために、私はあなたの実装が std::map
バギーではありません。
私の腸の感覚は、初期化されていないマップを探すことです。 VoteContainer
物体。いくつかありますか VoteContainer*
呼び出す前に割り当てるのを忘れたこと registerVote
その上?
他のヒント
Linuxで作業している場合、Valgrindツールをお勧めします。問題がどこにあるかを見つけるのに役立つはずです
2つの推測:
コードを呼び出すことを表示できますか
registerVote()
方法? (私はそれがいくつかの手がかりを与えるかもしれないと思う。)置くことができますか
m_votes.clear();
の中に VoteContainer
コンストラクタ?