Это не законно.Согласно [lib.associative.reqmts] в C ++ 98, «члены стирания должны делать недействительными только итераторы и ссылки на стертые элементы».Так как reverse_iterator определен примерно так:
template<typename Iter>
class reverse_iterator {
Iter current;
Iter tmp;
public:
...
Iter base() { return current; }
reference operator*() {
tmp = current;
--tmp;
return *tmp;
}
};
при удалении gonnaDelete
вы также лишаете законной силы reverseIt.current
, поэтому при последующем разыменовании reverseIt
вы получаете неопределенное поведение.
Теперьитераторы набора, как правило, являются простыми указателями на узлы, а оптимизированные распределители иногда оставляют память удаленного узла в одиночку, поэтому иногда случается, что код выполняет то, что вы ожидаете, даже после того, как вы аннулировали один из них, но это совсем не гарантируетсяработать.Я подозреваю, что VC ++ имеет режим отладки по умолчанию, чтобы поймать такую ошибку.Чтобы включить эквивалентный режим gcc, попробуйте собрать с -D_GLIBCXX_DEBUG
: http://gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/manual/manual/bk01pt03ch17s03.html