2010-03-01 6 views
1

Je reçois une erreur de segmentation lors de l'itération sur un ensemble. La trace de la pile pointe àErreur de segmentation de std :: _ Rb_tree_const_iterator <Type> :: operator ++

std::_Rb_tree_const_iterator<Type>::operator++ 
std::_Rb_tree_increment() 

mais je ne reçois rien de plus informatif. L'itérateur est sur un ensemble retourné par une fonction

for (FactSet::factset_iterator fact_it = (*binSet_it).getDependencyGraph().getExtentionalFactSet().begin(); 
       fact_it != (*binSet_it).getDependencyGraph().getExtentionalFactSet().end(); 
       ++fact_it) {...} 

Je ne vois pas le problème. Merci d'avance.

Répondre

2

Vous ne voulez pas faire d'itération sur la valeur de retour comme ça. La condition de terminaison du milieu est réévaluée à chaque itération, donc votre end() sera pour un ensemble différent à chaque fois, ce qui signifie que votre itérateur ne l'atteindra jamais.

Mettre en cache l'ensemble dans une variable locale, puis utiliser les begin() et end() à partir de cela.

+0

Merci, c'est très logique. J'ai essayé une approche différente: 'pour (FactSet :: factset_iterator fact_it = (* binSet_it) .getDependenceGraphRef(). GetExtentionalFactSetRef(). Begin(); fact_it! = (* BinSet_it) .getDependencyGraphRef(). GetExtentionalFactSetRef() .end(); + fact_it) {...} ' où getDependencyGraphRef et getExtentionalFactSetRef retournent des références constantes. Cela fonctionne. Je voulais éviter de copier car la structure avec laquelle je travaille est assez grande. – myahya

+0

Si vous voulez éviter la copie, vous pouvez aussi faire 'const FactSet & fset = (* binSet_it) .get ...' et ensuite utiliser 'fset'. Puisque c'est une référence 'const', vous n'encourez pas de copie. –

1

Est-ce que vous effacez des éléments dans la boucle? Dans ce cas, vous devez prendre la valeur de retour de la fonction d'effacement (qui donne l'itérateur au premier élément après celui (s) supprimé) et vous ne devez pas effectuer ++ après ce tour (qui passerait l'élément suivant, ou si c'était déjà à la fin, peut-être provoquer un segfault dans l'opérateur ++).

Questions connexes