两个哈希表间移动用户数据时同步删除异常求助
问题根源与解决方案
嗨,我来帮你搞定这个问题~
你的核心问题出在两个哈希表共享了同一个用户结构体的内存地址,导致修改其中一个会影响另一个:
问题分析
在delete_user函数里,你从active_users拿到tmp指针后,直接把它插入到inactive_users中。这意味着active_users和inactive_users的桶都指向同一块内存里的同一个user结构体。
然后你调用delete_item时,只是把这个结构体的occupied字段设为false——因为两个哈希表指向的是同一个结构体,所以inactive_users里的那个“用户”的occupied也会被改成false,看起来就像是被移除了,进而引发后续异常。
修复方案
迁移用户时,不要直接传递原指针,而是复制一份用户数据到新分配的结构体,再插入到inactive_users。修改后的delete_user函数如下:
void delete_user(hashtable *active_users, hashtable *inactive_users, char *input_a){ if(contains(active_users, input_a) != -1){ user *original_user = get_item(active_users, input_a); // 获取原用户指针 // 为inactive用户分配新的内存 user *inactive_user = malloc(sizeof(user)); if(inactive_user == NULL){ fprintf(stderr, "Error: Failed to allocate memory for inactive user\n"); return; } // 复制原用户的所有数据 strcpy(inactive_user->nick, original_user->nick); strcpy(inactive_user->name, original_user->name); inactive_user->occupied = true; // 新用户标记为已占用 insert2(inactive_users, inactive_user); // 插入新用户到inactive表 delete_item(active_users, input_a); // 标记原用户为未占用 printf("+ user %s removed\n", input_a); }else{ printf("+ user %s doesnt exist\n", input_a); } }
额外注意事项
- 内存管理:原用户结构体在
active_users里只是被标记为未占用,并没有被释放。记得在程序退出前,遍历两个哈希表,释放所有通过malloc分配的user结构体,避免内存泄漏。 - 如果你的哈希表后续会复用
occupied=false的位置,也要确保不会重复释放内存。
内容的提问来源于stack exchange,提问作者user7437907
相关产品推荐
相关产品推荐

