std::list问题:迭代器=list_name.begin()正在崩溃



我有一个名为PacketList的类。它有一个私人成员,是std::list:

std::list<数据包_t>packets_(Packet_t是我全局定义的结构(

以及作为该列表的迭代器的私有成员:

std::list<数据包_t>:迭代器it=packets_.begin((

我有一个公共成员函数,它每次返回一个列表元素:

Packet_t advance_one_packet() {
if (it != packets_.end()) {
it++;
}
else {
it = packets_.begin();
}
Serial.print("current packet is ");
Serial.println(it->name);
return *it;
}

每隔几秒钟从main.cpp调用advance_one_packet((,以显示下一个数据包的内容。如果列表为空,则不会调用它。

这一切在第一次浏览列表时都非常完美。但在它返回列表中的最后一个元素,然后执行它=packets_begin((之后,会发生一些不好的事情。我知道这一点是因为在这一点上,Serial.print("当前数据包是"(成功,但Serial.println(it->name(严重崩溃!我的串行监视器输出如下:

current packet is BME280temp
current packet is BME280pressure
// now it's trying to show the first element again:
current packet is $��?4␒��␐␀␀␀v���@␙�?␁�Al ␀␀␀xV����@␙�?␁�Al ␀␀␀xV�� (etc., etc.)

你觉得我做错了什么吗?我应该能够在列表中不断循环,对吧?谢谢你的任何想法。

回想一下,end()不是指最后一个元素,而是"一个过去";最后一个元素。

[packet 0] -> [packet 1] -> [packet 2] -> [end indicator]
^^^^^^^^^^                                ^^^^^^^^^^^^^^^
packets_.begin()                          packets_.end()

it指向最后一个元素(数据包2(的情况下输入函数时,它不等于.end(),因此递增迭代器。现在它等于.end(),下面对it->name的调用试图取消引用某个未指定的位置,该位置在输出中显示为垃圾。

最新更新