Quote Originariamente inviata da themagiciant95 Visualizza il messaggio
Il mio libro purtroppo non spiega bene questo concetto..
Una lista linkata è una struttura in cui ciascun elemento è qualcosa di simile a questo:
codice:
struct Elem
{
    Elem *next;
    Elem *prev;
    T payload;
}
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:
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;    
}
(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)
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.