列出迭代器不能解除引用?

时间:2010-04-19 13:05:26

标签: c++ visual-studio-2005 stl iterator

使用以下代码时出现错误“list iterator not 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_frontsizeemptyend_list_of_messages检查,但不会{{ 1}}来电。

我研究过STL文档,看不出任何明显的问题。上面的代码有什么问题,或者我在某处有内存泄漏?

谢谢!理解!

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

你有竞争条件吗?

如果列表为空,那么在尝试取消引用begin()时会出现问题,但是检查是否为空。你有另一个线程并行添加或删除列表中的项目吗?

您的代码段在VS 2008上适用于我(假设我将Counted_message_reader int键入{{1}}。

答案 2 :(得分:0)

对于列表,当它引用的列表元素被删除时,迭代器将失效。这可能发生了什么,但我没有在您的示例代码中看到它。某处的野指针? (不确定,在编码太多之后我可能会失明。)