J'ai souvent vu ce genre de bugs, lorsque des gens faisaient des erase() sur l'element en cours (ie un for( ; it != e; ++it) ... list.erase( it );
Un is_valid est assez difficile a implenter a vrai dire, enfin sans modifier STL. Tu peux tester la validite de l'adresse, mais ca depends vraiment de comment tu gere la memoire. Le _HAS_ITERATOR_DEBUGGING sur PC aide pas mal a choper ces erreurs.
Alternativement tu peux faire un petit proxy:
(example rapide pour donner l idee)
template<class Container, class Type > class ProxyIterator
{
typedef Container<Type> ContainerType;
typedef ContainerType<Type>::const_iterator IteratorType;
const ContainerType& _obj;
IteratorType& _it;
void check_validity()
{
IteratorType it = _obj.begin();
IteratorType e = _obj.end();
for( ; it != e; ++i )
if( it == _it )
return;
assert( false );
}
public:
ProxyIterator( const ContainerType& obj, IteratorType it ) : _obj( obj ), _it( it ) {}
operator Type() { check_validity(); return *_it; }
operator++()
{
check_validity();
++_it;
};
etc..