Wpis z mikrobloga

Ej, dobra, #programowanie #cpp - bo się zamotałem. Iteruję sobie po liście z pointerami do własnego strukta:

for (auto it = db.groups.begin(); it != db.groups.end(); ++it) {
((Group*) *it)->restore();
}

gdzie db.groups to QList, a Group::restore() emituje sygnał który może ale nie musi wywalić ten pointer z listy; chodzi o to, że w trakcie iteracji ta lista może się zmienić... no i to oczywiście powoduje problemy... jeżeli 3 lub więcej pointerów zniknie (nie ma problemu dla dwóch lub jednego) to przedostatni pointer wskazuje na zwolnioną już pamieć no i ten cały seg fault. Co zrobić żeby iteracja dalej trwała i nie gubiła porządku?
  • 6
auto it = db.groups->get_all().begin();
while (it != db.groups->get_all().end()) {
Group * g = ((Group*) *it);
bool b = g->get_to_create();
g->restore();
if (!b) {
++it;
}
}

tak działa... ale #!$%@?. xD i nie podoba mi się bo nie chcę dwa razy warunku sprawdzać (w restore i tutaj, w przyszłosci coś zmienić i #!$%@?...)
@qtsms: Funkcja usuwająca z reguły zwraca iterator następnego elementu, ale skoro robisz to w handlerze sygnału to masz 2 opcje:
1) zrobić głęboką kopię listy i po niej iterować
2) uƶywać indeksów, czyli for(int i = 0; i < db.groups.size(); ++i){ ... } (zakładając, ƶe usuwanie działa tylko wprzód)