2010-04-19 13 views
5

me sale el error "iterador de la lista no dereferencable" cuando se utiliza el siguiente código:¿El iterador de lista no es desreferenciable?

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 línea que comienza con "Counted_message_reader ..." es el que da el problema)

Tenga en cuenta que la el error no siempre ocurre, pero aparentemente en momentos aleatorios (generalmente cuando hay muchos datos almacenados en el búfer).

_list_of_messages se declara como sigue:

std::list<Counted_message_reader> _list_of_messages; 

En el código que rodea podíamos hacer pop_front, push_front y size, empty o end controles de _list_of_messages pero no erase llamadas.

He estudiado la documentación de STL y no puedo ver ningún problema evidente. ¿Hay algún problema con el código anterior o tengo una pérdida de memoria en alguna parte?

Gracias! ¡Apreciado!

+0

En lugar de usar * (_ list.begin()) puede usar _list.front(). – Patrick

+0

¿está accediendo a la lista desde múltiples hilos? – Naveen

+0

@ Patrick - ¿Hará alguna diferencia? – Roderick

Respuesta

3

¿Podría tener una condición de carrera?

Si la lista estuviera vacía, entonces esperaría un problema al intentar quitar la referencia begin(), pero verificará si está vacía. ¿Tiene otro hilo que agrega o quita elementos de la lista en paralelo?

Sus fragmentos de código me funcionan en VS 2008 (suponiendo que escribo typef Counted_message_reader en int).

+1

Hola, Adrian, no tengo otros hilos que accedan al código. Counted_message_reader es una clase, pero eso no debería importar en este ejemplo. El código también funciona bien para mí en general, este error parece ser 'aleatorio': - / – Roderick

0

Para una lista, los iteradores se invalidan cuando se borra el elemento de la lista a la que hace referencia. Eso es probablemente lo que sucede, pero no lo veo en su código de muestra. Puntero salvaje en alguna parte? (no estoy seguro, puedo ser ciego después de demasiada codificación).

+0

He comprobado específicamente la invalidación de "borrar" pero tampoco la veo. Sin punteros, hacemos la misma deferencia en otro lugar, pero eso solo se usa localmente. – Roderick

+0

pop_front también borra, pero como se comprueba debe suceder en otro hilo para tener algún efecto (basicallt lo que Adrian sugiere). – kriss

3

Esta afirmación generalmente indica algún tipo de error de corrupción de memoria, como cuando ha estado manipulando una lista de varios hilos o ha sobrescrito la memoria que almacena la 'contabilidad' para la lista.

+0

Sospecho que se ha sobrescrito la memoria, pero eso no es lo que quiero escuchar, así que espero otros problemas/sugerencias :) – Roderick

Cuestiones relacionadas