这段代码在遍历QHash<int, sSFMLogDatainInfo*>时存在潜在问题。当删除元素并使用erase()函数后,迭代器已无效,并且在下一次循环中进行自增操作可能导致未定义的行为。
建议您在执行删除操作之前先保存下一个迭代器,然后再删除当前元素。以下是修正后的示例:
QHash<int, sSFMLogDatainInfo*>::iterator it = ConnectClientInfo::GetSocketHash().begin();
while (it != ConnectClientInfo::GetSocketHash().end())
{
sSFMLogDatainInfo* info = it.value();
if (info->Heartbeat == 0)
{
closesocket(info->sockID);
delete info;
emit server->offlineSockUI(info);
it = ConnectClientInfo::GetSocketHash().erase(it); // 删除当前元素,并返回下一个有效迭代器
}
else
{
info->Heartbeat = 0;
++it; // 继续到下一个元素
}
}
在上面的修正代码中,我们将循环改为使用while循环,并手动更新迭代器。首先,我们将下一个有效迭代器存储在变量it中,然后通过调用erase()函数来删除当前元素并获取下一个有效迭代器。对于不需要删除的情况,我们只是更新了心跳计数并将迭代器自增。这样可以确保正确地遍历和删除QHash中的元素。
内容由零声教学AI助手提供,问题来源于学员提问




