shared_ptr i lista

0

Witam, gdy usuwam element z listy w taki sposób:


std::list<std::shared_ptr<element> > elements;
std::shared_ptr<element> nelement(new element);
elements.push_back(nelement);
//...
for(std::list<std::shared_ptr<element> >::iterator iter = elements.begin(); itera != elements.end(); ++iter)
{
     //...
     elements.erase(iter);
     //tutaj break;
}

otrzymuje sigsegv, w jaki sposób mogę usunąć element z listy?
Ta pętla for jest puszczona w innej pętli, gdy po usunięciu elementu przerwę pętle(break), to wszystko ładnie działa.

Wątek utworzył się 3 razy, a wyświetlało się "Upłynął czas... proszę spróbować ponownie".

1

http://www.cplusplus.com/reference/list/list/erase/

Iterators, pointers and references referring to elements removed by the function are invalidated.
All other iterators, pointers and references keep their validity.

Co oznacza że iterator którym poruszasz sie w pętli przestaje być poprawny po takiej operacji.
Jeśli chcesz to tak zrobić, to musisz zrobić mały "trik" -> zapamiętać iterator do usuwanego elementu, przesunąć iterator główny do przodu o 1 miejsce, usunąć element (na podstawie zapamiętanej wersji), cofnąć iterator główny o 1.

1

Akurat w przypadku listy (oraz klas vector, deque oraz forward_list) metoda erase() (erase_after() w forward_list) zwraca iterator na element za ostatnim usuniętym, więc takie triki są zbędne lub nawet niewskazane. Jednak jeśli chcesz usunąć wszystkie elementy, to polecam clear() ( http://en.cppreference.com/w/cpp/container/list/clear )

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0