C语言哈希表双层结构体指针分配内存泄漏问题咨询
问题原因解答
- 首先排查笔误问题
你代码中定义的哈希表二级指针变量名为hash_tables,但后续分配内存时写的是hash_table[0],缺少末尾的s,如果实际运行代码存在该拼写错误,会直接访问非法内存,引发逻辑异常甚至崩溃;如果是你整理问题时的手误,可以忽略该问题。 - 核心内存泄漏原因
当你使用指针形式定义桶struct Bucket** bucket时:hash_tables[0]->bucket = malloc(sizeof(Bucket*)*10);仅分配了10个Bucket*指针的存储空间,这10个指针默认是未初始化的野值,并非NULL- 后续你操作哈希表(插入节点、释放内存)时,如果没有先将这10个指针初始化为NULL,会导致链表遍历、释放逻辑异常:比如释放时无法识别链表的终止位置,或是跳过了对
bucket指针本身的释放,最终造成内存泄漏
而你改成结构体内部数组struct Bucket* bucket[10]后,10个指针的存储空间是直接内嵌在Table结构体里的,不需要额外malloc,自然也不会出现额外分配的bucket数组未释放的问题,只要初始化时把数组内的指针设为NULL即可正常运行。
- 第一种写法的修复方案
修正后的分配代码如下:
// 修正变量名拼写 hash_tables[0] = malloc(sizeof(Table)); hash_tables[0]->bucket = malloc(sizeof(Bucket*)*10); // 新增:初始化所有桶指针为NULL for(int i=0; i<10; i++){ hash_tables[0]->bucket[i] = NULL; }
释放时按顺序释放即可避免泄漏:
// 先释放每个桶的链表节点 for(int i=0; i<10; i++){ Bucket* cur = hash_tables[0]->bucket[i]; while(cur != NULL){ Bucket* temp = cur; cur = cur->next; free(temp); } } // 再释放bucket数组 free(hash_tables[0]->bucket); // 最后释放Table本身 free(hash_tables[0]); hash_tables[0] = NULL;
内容的提问来源于stack exchange,提问作者JamesTheProg
相关产品推荐
相关产品推荐

