Liste itérateur pas dereferencable?
J'obtiens l'erreur "liste itérateur pas dereferencable" lorsque vous utilisez le code suivant:
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 ligne commençant par "Counted_message_reader..." est celui qui donne le problème)
Remarque que l'erreur ne se produit pas toujours, mais apparemment de façon aléatoire (généralement quand il y a beaucoup de données mises en mémoire tampon).
_list_of_messages
est déclarée comme suit:
std::list<Counted_message_reader> _list_of_messages;
Dans les environs de code que nous pourrions faire pop_front
, push_front
et size
, empty
ou end
contrôles sur _list_of_messages
mais pas erase
appels.
J'ai étudié la STL de la documentation et ne peuvent pas voir les problèmes flagrants. Est-il quelque chose de mal avec le code ci-dessus ou dois-je avoir une fuite de mémoire quelque part?
Merci! Apprécié!
êtes-vous accéder à la liste à partir de plusieurs threads?
Patrick, qui fera toute la différence?
Naveen - non, pas l'utilisation de plusieurs threads
OriginalL'auteur Roderick | 2010-04-19
Vous devez vous connecter pour publier un commentaire.
Pourriez-vous avoir une course-état?
Si la liste est vide, alors je m'attends à un problème lorsque vous essayez de déréférencer begin(), mais vous vérifier vide. Avez-vous un autre thread ajoutant ou en supprimant des éléments de la liste en parallèle?
Vos extraits de code fonctionne pour moi sur VS 2008 (en supposant que je typedef
Counted_message_reader
àint
).OriginalL'auteur Adrian McCarthy
Cette affirmation indique généralement une sorte de corruption de la mémoire de bug, comme lorsque vous avez été la manipulation d'une liste à partir de plusieurs threads, ou si vous avez remplacé la mémoire qui stocke la "comptabilité" pour la liste.
OriginalL'auteur Nick Meyer
Pour une liste, les itérateurs sont invalidés lorsque l'élément de la liste à laquelle il se réfère est effacé. C'est probablement ce qui se passe, mais je ne le vois pas dans votre exemple de code. Sauvage pointeur quelque part ? (pas sûr, je suis peut-être aveugle à la suite de trop de codage).
pop_front fait aussi effacer, mais que vous vérifiez qu'il devrait se passer dans un autre thread pour avoir un effet quelconque (basicallt ce Adrian suggère).
OriginalL'auteur kriss