Błędy przy usuwaniu elementów z listy stl

0

Witam mam problem z usuwaniem elementów z listy :

Debug Assertion Failed!

//…

Expression: list iterator not incrementable

I strzałka pokazuje mi na kod w stdthrow.cpp:

_CRTIMP2_PURE void __CLRCALL_PURE_OR_CDECL _Debug_message(const wchar_t *message, const wchar_t *file, unsigned int line)
	{	// report error and die
        if(::_CrtDbgReportW(_CRT_ASSERT, file, line, NULL, message)==1)
        {
->           ::_CrtDbgBreak();
        }
	}

Mój kod:

           list<CIstota*>::iterator iter;
	for(iter = lista.begin();iter!=lista.end();++iter)
	{
		if((*iter)->f_get_stan_zycia()==false)
		{
			delete *iter;
			iter=lista.erase(iter);
		}
	
           }

Zauważyłem ,że ten kod wywoływany w pętli kilka razy działa poprawnie a dopiero po jakimś czasie wywala to co napisałem powyżej.

0

Wartość iteratora / ilość elementów na liście
1 / 6
2 / 5
3 / 4
4 / 3 <- błąd - przecież 4 elementu już nie ma

Tak myślę.

0

Czyli w pewnym momencie usuwam nieistniejący element listy??

0
for(iter = lista.begin();iter!=lista.end();++iter) {
    while(iter!=lista.end() && !(*iter)->f_get_stan_zycia()) {
        delete *iter;
        iter=lista.erase(iter);
    }       
}

albo jak wolisz to ```cpp for(iter = lista.begin();iter!=lista.end();++iter) { while(!(*iter)->f_get_stan_zycia()) { delete *iter; iter=lista.erase(iter); if(iter==lista.end()) { break; //lub return } } } ```

poza tym pooglądaj dokładnie "call stack", by zobaczyć w którym miejscu twojego kodu powstał problem, a nie pokazuj nam, że gdzie w jakiejś bibliotece problem się objawił.

0
for(iter = lista.begin();iter != lista.end();)
{
	if((*iter)->f_get_stan_zycia() == false)
	{
		delete *iter;
		iter = lista.erase(iter); //<--- albo to co zwróci erase
	}
	else ++iter; //<--- albo to
}

p.s. w tym układzie pętla while byłaby sensowniejsza.

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