Список итераторов не разыменовывается? - PullRequest
5 голосов
/ 19 апреля 2010

Я получаю сообщение об ошибке «Итератор списка не разыменовывается» при использовании следующего кода:

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

Спасибо! Оценил!

Ответы [ 3 ]

4 голосов
/ 19 апреля 2010

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

3 голосов
/ 19 апреля 2010

Не могли бы вы иметь состояние гонки?

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

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

0 голосов
/ 19 апреля 2010

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

...