c++ stl stdmap segmentation-fault

c++ - Error de segmentación en std:: map:: insert(...)



stl stdmap (3)

He usado la búsqueda pero no he encontrado la respuesta que me satisfaga ... así que ... esto es un pedazo de código:

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

y cómo lo uso:

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

tengo segfault en independientemente de lo que hago:

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

Intenté usar std :: map :: find (...) primero, pero tengo el mismo resultado. retroceso:

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

supongo que el motivo de segfault es el argumento __y=@0x758948f87d894905 . no tengo idea de por qué es esto! en ese momento, el mapa m_votes está vacío. por favor, sugiérame ...

Como Matthieu M. dice que la razón más probable es el valor no inicializado __y=@0x758948f87d894905 , pero __y tiene el tipo de order_id_t pero no Vote

He intentado reescribir el código:

std::map<int, int> m_votes;

y esto no resolvió mi problema, por lo tanto, el problema no está en mis tipos ...

aquí está el código que invoca el método 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()); };

Ayer, descubrí que no hay problema en mi código. he reemplazado std :: map por otras estructuras stl, pero el resultado fue el mismo. he eliminado stl de ese código y segfault estaba en Vote constructor, he eliminado esta clase y segfault estaba en otras estructuras STL de mi código. ¿que es eso? ayudame por favor.

Descubrí el motivo de mi problema, ese no es este código. problema estaba en mi código anterior. gracias a todos por participar en esta discusión.


Dos conjeturas:

  1. ¿Puedes mostrar el código llamando al método registerVote() ? (Sospecho que puede dar alguna pista.)

  2. Puedes poner

    m_votes.clear ();

en el constructor VoteContainer ?


Por lo que puedo ver, me atrevería a decir que falta el código realmente importante.

Como se señaló: this=0x407a59, __x=@0x7fffffff0b50, __y=@0x758948f87d894905 es bastante extraño, las direcciones están demasiado separadas, por lo que podemos suponer que una de ellas (al menos) simplemente no está inicializada. Y por mi propia cordura, supongo que su implementación de std::map no tiene errores.

Mi instinto sería buscar un mapa no inicializado, y por lo tanto, y VoteContainer objeto VoteContainer no VoteContainer . ¿Tendría algún VoteContainer* que olvidó asignar antes de invocar registerVote en él?


Si trabajas en Linux, puedo recomendarte la herramienta valgrind, debería ayudarte a encontrar dónde está el problema