c++ - Vector iterator > vector.end() even though the vector should not have been reallocated -
first: happy update question in title if can think of more concise way put it.
here's situation:
i have vector class member. after extracting element vector following:
inline int currenttoken() { /* __it of type std::vector <int>::iterator */ return (__it < __tokens.begin()) ? syntax::out_of_range_begin : (__it > __tokens.end()) ? syntax::out_of_range_end : *__it; } the returned integer expected (in case, 65, should have been).
now things tricky, however. when particular token encountered, sparks new chain of events , previous tokens in vector need discarded.
first, call class' 'savelocation' member function, inline quickie:
__saved_it = __it; then, call 'truncatehead' member function, error occurs. before code, point out none of above has in way changed vector, there absolutely no reason vector's memory have been reallocated.
__it = __tokens.erase(__tokens.begin(), __saved_it+1); //segfault some debugging has revealed somehow __it greater __tokens.end(), though still both larger __begin and dereferenced number '65' expected.
how not in range between __tokens.begin() , __tokens.end()?
in fact, situation present in savelocation method above.
remembering currenttoken() followed savelocation(), , currenttoken have returned integral representation of out_of_range_end if iterator out of range, flummoxed.
completely , utterly.
tokens.end() returns past end iterator. is, outside of range.
it's not meaningful compare if iterator bigger (>) past end iterator, iterators range begin() end(). because of same reason, not meaningful check if iterator less iterator returned begin().
this means there's no way of checking if iterator out_of_range_begin or out_of_range_end. can check if it's inside valid range or not.
it's ok check if iterator bigger or equal (>=) iterator returned begin().
when check if __it past last element should evaluate if iterator not equal tokens.end()
e.g. should check like
return (__it >= __tokens.begin() && __it != __tokens.end()) ? *__it : syntax::out_of_range; this requires not increment iterator past containers past-the-end-iterator. accessing memory pointed iterator has been incremented past end()-iterator result in undefined behaviour.
Comments
Post a Comment