Prometheus Prometheus escribió:
Hi all,
i have the following problem: i use multi_index like this std::pair<Plugins::pEvents::index::type::iterator,Plugins::pEvents::index::type::iterator> range; range = this->events.get().equal_range(boost::make_tuple(event,condition)); while(range.first!=range.second){ // CALL an event handler! this->callEventHandler(range.first); // << this shows just how it works, its not exactly my code ++range.first; }
within the callEventHandler and its called functions its possible that the event handler wants to register new events which results to this: this->events.insert(eventdata);
The problem is OR can be, that the insert modifies the indices which modify the range.first iterators and thus a ++range.first results in an invalid "next" element this makes sense and i think most of you know this and had this problem already
Questions: Does anyone have a good idea/solution how to solve this situation correctly so that the range i received will be valid?
I think the easiest solution is to save copies of the iterators in range before you start the loop: range = this->events.get().equal_range(boost::make_tuple(event,condition)); std::vector<Plugins::pEvents::index::type::iterator> buff; while(range.first!=range.second)buff.push_back(range.first++); for(std::size_t n=0,s=buff.size();n<s;++n){ // CALL an event handler! this->callEventHandler(buff[n]); } HTH, Joaquín M López Muñoz Telefónica, Investigación y Desarrollo