列表迭代器无法解引用?

5

当我使用以下代码时,出现“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;

在周围的代码中,我们可以对 _list_of_messages 进行 pop_frontpush_frontsizeemptyend 检查,但没有 erase 调用。
我已经研究了STL文档,没有发现任何明显的问题。以上代码有问题吗?还是我在某个地方有内存泄漏?
谢谢!感激不尽!

你可以使用_list.front()代替*(_list.begin())。 - Patrick
你是否从多个线程访问列表? - Naveen
@ Patrick - 那会有任何区别吗? - Roderick
@ Naveen - 不,没有使用多线程。 - Roderick
3个回答

4
这个断言通常说明存在某种内存损坏漏洞,例如当您从多个线程操作列表或覆盖存储列表 'bookkeeping' 的内存时。

我怀疑是内存被覆盖了,但这不是我想听到的 - 所以我希望有其他问题/建议 :) - Roderick

3

你可能会遇到竞态条件吗?

如果列表为空,则尝试解引用begin()时我希望出现问题,但你已经检查了是否为空。你是否有另一个线程在并行地添加或删除列表项?

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


1
嗨Adrian,我没有其他线程访问代码。 Counted_message_reader是一个类,但对于这个例子来说这并不重要。总的来说,我的代码运行得很好 - 这个错误似乎是“随机”的 :-/ - Roderick

0

对于列表,当它所引用的元素被删除时,迭代器将失效。这可能是发生了什么,但我在您的示例代码中没有看到它。是否存在野指针?(不确定,可能是因为编码太久而变得盲目了)。


我已经特别检查了“erase”失效,但也没有看到它。没有指针,我们在其他地方做了相同的解引用,但那只在本地使用。 - Roderick
pop_front也会执行erase操作,但是根据您的检查,它应该在另一个线程中执行才能产生任何效果(基本上就是Adrian建议的)。 - kriss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接