Итератор списка, не dereferencable?

Я получаю ошибку "итератор списка, не 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 и не вижу явных проблем. Есть ли что-то не так с вышеупомянутым кодом, или у меня есть утечка памяти где-нибудь?

Спасибо! Ценивший!

5
задан Pillsy 19 April 2010 в 13:15
поделиться

3 ответа

Может ли быть состояние гонки?

Если список был пуст, то Я бы ожидал проблемы при попытке разыменования begin (), но вы проверяете пустоту. У вас есть другой поток, добавляющий или удаляющий элементы из списка параллельно?

Ваши фрагменты кода работают для меня в VS 2008 (при условии, что я набираю Counted_message_reader на int ).

3
ответ дан 14 December 2019 в 08:46
поделиться

Для списка итераторы становятся недействительными, когда элемент списка, на который он ссылается, стирается. Вероятно, так и происходит, но я не вижу этого в вашем примере кода. Дикий указатель где-нибудь? (не уверен, я могу ослепнуть после слишком большого количества кодирования).

0
ответ дан 14 December 2019 в 08:46
поделиться

Это утверждение обычно указывает на какую-то ошибку повреждения памяти, например, когда вы вы управляли списком из нескольких потоков или вы перезаписали память, в которой хранится «бухгалтерия» для списка.

4
ответ дан 14 December 2019 в 08:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: