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