Una lista linkata è una struttura in cui ciascun elemento è qualcosa di simile a questo:
dove "next" punta all'elemento successivo, "prev" al precedente e payload contiene il dato che effettivamente hai memorizzato. Un iteratore relativo ad una std::list sostanzialmente è un puntatore a questa struttura. Quando tu chiami la erase, concettualmente quello che succede è:codice:struct Elem { Elem *next; Elem *prev; T payload; }
(ci sono un po' più di check e qualche corner case da gestire, a seconda della convenzione scelta per la gestione della "fine lista", ma il concetto è questo)codice:Elem *erase(Elem *pos) { // Aggiusta i puntatori dell'elemento precedente e successivo pos->prev->next = pos->next; pos->next->prev = pos->prev; Elem *ret = pos->next; delete pos; return ret; }
Come vedi, l'iteratore che hai passato (pos) non è più valido al termine della funzione, dato che punta ad un elemento che è stato deallocato. Accedervi nuovamente risulterà in crash, corruzione di dati o "apparente funzionamento" in maniera più o meno casuale.


Rispondi quotando