Node* conflict_node = bucket->head_node_; while(conflict_node) { conflict_count++; if (CmpKey(conflict_node->key_, key_data)) {//冲突时释放之前的,重新保存新的 if(conflict_node->value_==value) {//先测试后再确认是否可以; exist_flag_ = 200; SetConflictCount(INSERT_TYPE, conflict_count); return conflict_node; } value_mem->ReleaseOneValue(conflict_node->value_->node_ptr_);//此处存在问题,conflict_node->value_==value时,会将value放至free列表,但是后面又调用value->use_count_++,会导致在free列表中但是又在hash使用中; Value* new_value = NULL; if (!value) { new_value = value_mem->ApplyOneValue(1); } else { /* *入口处提到的问题 *如果此时@param value与conflict_node->value_是同一个指针的话 *value_mem->ReleaseOneValue后,在HashValue中它已经被标记为 *未使用并归还至可用链表中,而下一行代码则会让hashmap通过key仍能 *访问@param value对应的内存。这与设计不符 */ new_value = value; new_value->use_count_++; } if (!new_value) { return NULL; } conflict_node->value_ = new_value; exist_flag_ = 200; SetConflictCount(INSERT_TYPE, conflict_count); return conflict_node; } conflict_node = conflict_node->next_node_; }什么意思
时间: 2024-02-10 12:23:02 浏览: 78
git-basics:远程仓库帮助测试我的 Git_skls
这段代码是在哈希表中处理冲突的情况。如果哈希桶中已经存在节点且键值与插入的键值相同,则需要更新节点的值。如果节点的值指针与插入的值指针相同,则不需要更新,直接返回该节点。否则,需要申请一个新的值,并将原来的值释放。如果申请新值失败,则返回空指针。最后,更新节点的值和标记,返回该节点。
如果存在冲突节点,但是键值与插入的键值不同,则需要继续查找下一个节点,直到找到键值相同的节点或者遍历完整个链表。
阅读全文