这段代码存在一些问题。首先,QHash<int, sSFMLogDatainInfo*>::iterator it; 声明的迭代器类型应该是 QHash<int, sSFMLogDatainInfo*>::const_iterator it; 或者 auto it = ConnectClientInfo::GetSocketHash().constBegin();。
其次,关于删除元素的部分存在问题。在迭代器循环遍历时,不应该直接在容器内进行删除操作,因为这会破坏迭代器的有效性。正确的做法是先标记需要删除的元素,然后再进行删除操作。
下面是修正后的代码示例:
QHash<int, sSFMLogDatainInfo*> socketHash = ConnectClientInfo::GetSocketHash();
for (auto it = socketHash.begin(); it != socketHash.end(); )
{
sSFMLogDatainInfo* info = it.value();
if (info->Heartbeat == 0)
{
closesocket(info->sockID);
delete info;
it = socketHash.erase(it); // 删除当前项,并返回指向下一项的迭代器
}
else
{
if (socketHash.size() < 8) // 删除数量小于8的子项
it = socketHash.erase(it);
else
++it;
}
}
// 更新 ConnectClientInfo 的 Socket Hash
ConnectClientInfo::SetSocketHash(socketHash);
上述代码中,我们首先将 ConnectClientInfo::GetSocketHash() 复制到一个临时变量 socketHash 中,在遍历和删除过程中使用这个副本。对于需要删除的项,我们在 erase() 函数中获取了指向下一个项的迭代器,并将该迭代器赋值给 it,以保持循环的正确性。
最后,注意根据实际情况更新 ConnectClientInfo 的 Socket Hash,确保删除操作在整个系统中生效。
内容由零声教学AI助手提供,问题来源于学员提问




