【发布时间】:2020-01-04 01:29:06
【问题描述】:
我有一个结构元素向量,在一个函数中,当迭代它时,会抛出与绑定相关的不同错误。
我正在实现必须确认某些消息的 UDP 服务器-客户端连接。我实现了一个结构元素向量,其中每个元素都包含发送的消息,以及发送的时间(以毫秒为单位)。我认为这并不重要,因为我尝试过存储 std::string 而不是结构的相同函数,但以防万一。
当我收到一个 ACK 消息时,我完全没有问题地遍历这个向量:
///WORKING CODE IN OTHER FUNCTIONS
auto it = mACKExpected.begin();
for (; it != mACKExpected.end(); it++)
{
if (it->msg.msgCount() == count)
{
break;
}
}
但是,我有一个连接到 QTimer 超时的单独方法,该方法检查是否尚未确认超过一秒前发送的可确认消息:
///CODE 1
for (auto it = mACKExpected.begin();it!=mACKExpected.end();)
{
if ((curTime - it->millis) > mquiMsgTimeout)
{
debug() << "Message" << it->msg.raw() << "(count: " << it->msg.msgCount() << ") not acknowledged.";
send(QtStrMsg::newMsg(it->msg.msgType(), getCount(), it->msg.msgData()).raw());
}
++it;
}
我也尝试过迭代:
///CODE 2
for (auto it : mACKExpected)
{
if ((curTime - it.millis) > mquiMsgTimeout)
{
debug() << "Message" << it.msg.raw() << "(count: " << it.msg.msgCount() << ") not acknowledged.";
send(newMsg(it.msg.msgType(), getCount(), it.msg.msgData()).raw());
}
}
也可以使用 const 迭代器,但总是有错误。在 CODE 1 示例中,++it; 行中引发了“无法增加向量迭代器结束”异常。
在最后一个代码中,改为使用 std::bad_alloc{},但在 for(... 行中。如果我这样做删除当前的迭代器:
if ((curTime - it->millis) > mquiMsgTimeout)
{
debug() << "Message" << it->msg.raw() << "(count: " << it->msg.msgCount() << ") not acknowledged.";
send(QtStrMsg::newMsg(it->msg.msgType(), getCount(), it->msg.msgData()).raw());
it=mACKExpected.erase(it);
}
else
++it;
擦除行中出现“向量擦除迭代器超出范围”错误。
我能做什么?我已经坚持了两天了。我尝试使用 QVector 代替,但出现了同样的问题。在我看来,调用这个函数时有些东西坏了,但我不知道还能尝试什么。谢谢。
【问题讨论】:
-
请提供一个minimal reproducible example,而不是几个不完整的sn-ps
-
你在某处改变了向量,你的循环迭代器就失效了。
-
“连接到 QTimer 超时的单独方法”这不会在不同的线程中运行,不是吗?
-
[命名]:"
for (auto it : mACKExpected)"。it不是迭代器,中性的element/value会更合适(但更好地使用真正有意义的名称)。 -
@foreknownas_463035818 关于sn-ps,我知道它太长且不完整,但我打算尽我所能解释我的问题和我尝试过的事情。
标签: c++ qt c++11 qt5 stdvector