在你的代码中,你使用了 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助手提供,问题来源于学员提问