ZBLOG

for (it = ConnectClientInfo::GetSocketHash().constBegin(); it != ConnectClientInfo::GetSocketHash().constEnd(); ++it) { st_Studbanswer* value = it.value(); // value->HeartbeatStats = 1; if(value->strIp == strIp) { ...

在你的代码中,你使用了 constBegin()constEnd() 来迭代一个常量的哈希表,这会导致无法修改该哈希表。如果要在迭代过程中删除键值对,你需要使用非 const 的方法来获取可修改的哈希表。

此外,直接从正在遍历的容器中删除元素可能导致未定义行为。因此,建议使用待删除列表的方法,在完成遍历后再执行删除操作。下面是经过修改后的代码示例:

QList<quint16> keysToRemove; // 用于存储待删除的键

for (it = ConnectClientInfo::GetSocketHash().begin(); it != ConnectClientInfo::GetSocketHash().end(); ++it) {
    st_Studbanswer* value = it.value();
    if (value->strIp == strIp) {
        if (closesocket(it.key()) == SOCKET_ERROR) {
            qDebug() << "closesocket failed: " << WSAGetLastError() << endl;
        } else {
            qDebug() << "delete hash.value(it.key());";
            delete value; // 释放动态内存
            keysToRemove.append(it.key()); // 将键添加到待删除列表
        }
    }
}

// 删除待删除列表中的所有键
for (quint16 key : keysToRemove) {
    ConnectClientInfo::GetSocketHash().remove(key);
}

在这段代码中,我们首先遍历哈希表并将要删除的键存入 keysToRemove 列表。然后,在完成遍历后,再从哈希表中逐个移除这些键。这种方法能够避免在遍历过程中对集合进行修改,从而避免潜在的问题。


内容由零声教学AI助手提供,问题来源于学员提问

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?