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. 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
. i have no idea why this is! at that moment m_votes map is empty. 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 V开发者_如何转开发ote
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.
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! 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.
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.
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 ?
If you working under Linux, I can recommend valgrind tool, it should help you to find where is the problem
Two guesses:
Can you show the code calling the
registerVote()
method? (I suspect that may give some clue.)Can you put
m_votes.clear();
in the VoteContainer
constructor?
精彩评论