代码之家  ›  专栏  ›  技术社区  ›  Roderick

列表迭代器不可取消引用?

  •  5
  • Roderick  · 技术社区  · 14 年前

    当使用以下代码时,我得到错误“list iterator not dereferenced”(列表迭代器不可取消引用):

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

    (以“已计数的邮件阅读器…”开头的一行是给出问题的那一行)

    请注意,错误并不总是发生,但似乎是随机发生的(通常是在有大量缓冲数据的情况下)。

    _list_of_messages 声明如下:

    std::list<Counted_message_reader> _list_of_messages;
    

    在周围的代码中我们可以做到 pop_front , push_front size , empty end 检查 _列出\u条消息 但没有 erase 电话。

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

    谢谢!感谢!

    3 回复  |  直到 14 年前
        1
  •  3
  •   Adrian McCarthy    14 年前

    你有比赛条件吗?

    如果列表是空的,那么当尝试取消引用begin()时,我会预料到一个问题,但是您要检查是否为空。是否有其他线程并行添加或删除列表中的项目?

    你的代码片段在vs 2008上对我有效(假设我typedef Counted_message_reader int )

        2
  •  4
  •   Nick Meyer    14 年前

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

        3
  •  0
  •   kriss    14 年前

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