Please consider the following scenario:
map(T,S*) & GetMap(); //Forward decleration map(T, S*) T2pS = GetMap(); for(map(T, S*)::iterator it = T2pS.begin(); it != T2pS.end(); ++it) { if(it->second != NULL) { delete it->second; it->second = NULL; } T2pS.erase(it); //In VS2005, after the erase, we will crash on the ++it of the for loop. //In UNIX, Linux, this doesn't crash. }//for
It seems to me that in VS2005, after the ‘erase’, the iterator will be equal to end(), hence the crash while trying to increment it. Are there really differences between compilers in the behavior presented here? If so, what will the iterator after the ‘erase’ equal to in UNIX/Linux?
Thanks…
Yes, if you erase an iterator, that iterator gets a so-called singular value, which means it doesn’t belong to any container anymore. You can’t increment, decrement or read it out/write to it anymore. The correct way to do that loop is:
For containers that could invalidate other iterators when you erase one iterator,
erasereturns the next valid iterator. Then you do it withThat’s how it works for
std::vectorandstd::deque, but not forstd::maporstd::set.