ZBLOG

QHash::iterator it; for ( it = ConnectClientInfo::GetSocketHash().begin(); it != ConnectClientInfo::GetSocketHash().end(); ++it) { sSFMLogDatainInfo * infor = it.value(); if(infor->Heartbeat...

这段代码存在一些问题。首先,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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=13187

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?