2010-04-19 14 views
5

ottengo l'errore "iteratore di lista non dereferencable" quando si utilizza il seguente codice:Elenco iteratore non dereferenziabile?

bool done = false; 
while (!_list_of_messages.empty() && !done) { 
    // request the next message to create a frame 
    // DEBUG ERROR WHEN NEXT LINE IS EXECUTED: 
    Counted_message_reader reader = *(_list_of_messages.begin()); 
    if (reader.has_more_data()) { 
     _list_of_frames.push_back(new Dlp_data_frame(reader, _send_compressed_frames)); 
     done = true; 
    } else { 
     _list_of_messages.pop_front(); 
    } 
} 

(La linea che inizia con "Counted_message_reader ..." è quello che dà il problema)

Si noti che la l'errore non si verifica sempre ma apparentemente in momenti casuali (di solito quando ci sono molti dati bufferizzati).

_list_of_messages è dichiarato come segue:

std::list<Counted_message_reader> _list_of_messages; 

Nel codice circostante che potevamo fare pop_front, push_front e size, empty o end controlli _list_of_messages ma non erase chiamate.

Ho studiato la documentazione STL e non vedo alcun problema di abbagliamento. C'è qualcosa di sbagliato nel codice sopra o ho una perdita di memoria da qualche parte?

Grazie! Apprezzato!

+0

Invece di usare * (_ list.begin()) è possibile utilizzare _list.front(). – Patrick

+0

stai accedendo alla lista da più thread? – Naveen

+0

@ Patrick: farà la differenza? – Roderick

risposta

3

Potresti avere una condizione di gara?

Se l'elenco era vuoto, mi sarei aspettato un problema durante il tentativo di dereferenziaro begin(), ma si verifica vuoto. Avete un altro thread che aggiunge o rimuove elementi dalla lista in parallelo?

Gli snippet di codice funzionano per me su VS 2008 (supponendo che digiti Counted_message_reader a int).

+1

ciao Adrian, non ho altri thread che accedono al codice. Counted_message_reader è una classe ma ciò non dovrebbe avere importanza per questo esempio. Il codice funziona bene anche per me in generale - questo errore sembra essere "casuale": - / – Roderick

0

Per un elenco, gli iteratori vengono invalidati quando l'elemento dell'elenco a cui si riferisce viene cancellato. Probabilmente è quello che succede, ma non lo vedo nel codice di esempio. Puntatore selvaggio da qualche parte? (non sono sicuro, potrei essere cieco dopo troppa codifica).

+0

Ho verificato specificamente l'invalidazione "cancella" ma non la vedo neanche. Nessun puntatore, facciamo la stessa deferenza altrove, ma viene usata solo localmente. – Roderick

+0

pop_front cancella anche, ma quando si controlla dovrebbe succedere in un altro thread per avere un qualche effetto (di base quello che Adrian suggerisce). – kriss

3

Questa asserzione indica in genere una sorta di bug di danneggiamento della memoria, ad esempio quando si sta manipolando un elenco da più thread o si è sovrascritta la memoria che memorizza la "contabilità" per l'elenco.

+0

Sospetto di aver sovrascritto la memoria ma non è quello che voglio sentire - quindi spero di avere altri problemi/suggerimenti :) – Roderick