我使用了搜索,但我找不到满足我的答案...所以......这是一大堆代码:
//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结构中!那是什么?请帮帮我。
我发现了问题的原因,那不是这段代码。问题出在我以前的代码中。谢谢大家参与这次讨论。
答案 0 :(得分:5)
从我所看到的情况来看,我冒昧地发现了真正重要的代码。
如上所述:this=0x407a59, __x=@0x7fffffff0b50, __y=@0x758948f87d894905
很奇怪,地址太过分了,所以我们可以假设其中一个(至少)是未初始化的。为了我自己的理智,我认为你std::map
的实施不是错误的。
我的直觉是寻找未初始化的地图,因此,未初始化的VoteContainer
对象。在调用VoteContainer*
之前,您是否会忘记分配一些registerVote
?
答案 1 :(得分:1)
如果您在Linux下工作,我可以推荐valgrind工具,它应该可以帮助您找到问题所在
答案 2 :(得分:0)
两个猜测:
您能否显示调用registerVote()
方法的代码? (我怀疑这可能会提供一些线索。)
你能放
吗?m_votes.clear();
在VoteContainer
构造函数中?