简体   繁体   中英

List iterator not dereferencable?

I get the error "list iterator not dereferencable" when using the following code:

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();
    }
}

(The line beginning with "Counted_message_reader..." is the one giving the problem)

Note that the error doesn't always occur but seemingly at random times (usually when there's lots of buffered data).

_list_of_messages is declared as follows:

std::list<Counted_message_reader> _list_of_messages;

In the surrounding code we could do pop_front , push_front and size , empty or end checks on _list_of_messages but no erase calls.

I've studied the STL documentation and can't see any glaring problems. Is there something wrong with the above code or do I have a memory leak somewhere?

Thanks! Appreciated!

此断言通常表示某种内存损坏错误,例如,当您从多个线程操作列表或者您已覆盖存储列表的“簿记”的内存时。

Could you have a race-condition?

If the list were empty, then I'd expect a problem when trying to dereference begin(), but you check for empty. Do you have another thread adding or removing items from list in parallel?

Your code snippets works for me on VS 2008 (assuming I typedef Counted_message_reader to int ).

For a list, iterators are invalidated when the element of the list that it refers to is erased. That's probably what happens, but I don't see it in your sample code. Wild pointer somewhere ? (not sure, I may be blind after of too much coding).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM