Я получаю ошибку "итератор списка, не dereferencable" при использовании следующего кода:
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();
}
}
(Строка, начинающаяся "с Counted_message_reader...", является той, дающей проблему),
Обратите внимание, что ошибка не всегда происходит, но по-видимому наугад времена (обычно, когда существует много буферизированных данных).
_list_of_messages
объявляется следующим образом:
std::list<Counted_message_reader> _list_of_messages;
В окружающем коде мы могли сделать pop_front
, push_front
и size
, empty
или end
начинает работу _list_of_messages
но нет erase
вызовы.
Я изучил документацию STL и не вижу явных проблем. Есть ли что-то не так с вышеупомянутым кодом, или у меня есть утечка памяти где-нибудь?
Спасибо! Ценивший!
Может ли быть состояние гонки?
Если список был пуст, то Я бы ожидал проблемы при попытке разыменования begin (), но вы проверяете пустоту. У вас есть другой поток, добавляющий или удаляющий элементы из списка параллельно?
Ваши фрагменты кода работают для меня в VS 2008 (при условии, что я набираю Counted_message_reader
на int
).
Для списка итераторы становятся недействительными, когда элемент списка, на который он ссылается, стирается. Вероятно, так и происходит, но я не вижу этого в вашем примере кода. Дикий указатель где-нибудь? (не уверен, я могу ослепнуть после слишком большого количества кодирования).
Это утверждение обычно указывает на какую-то ошибку повреждения памяти, например, когда вы вы управляли списком из нескольких потоков или вы перезаписали память, в которой хранится «бухгалтерия» для списка.