我正在使用链接列表设置和加载哈希表。对于每个项目,我调用一个结构指针,然后将该项输入数组本身,或者如果采用数组索引则输入相关的链接列表。
所有作品都很精美,但是valgrind告诉我,我在结构项目的句子中有一个“绝对丢失”。
现在,我是C的新手,但熟悉Objective-C。在ARC之前的日子里,你可以分配一个对象,把它放在一个数组中,然后释放它。该数组将保留该对象。一旦你需要从项目中拉出项目,你需要先保留它。否则,它将很快丢失,因为数组将不再保留该对象。
所以,我想我的问题是:我如何获得一个数组/链表以保留其“对象”,所以我可以在将它输入数组或链表后释放alloc'd项?
// global array
struct_item** hashtable;
// declare struct
typedef struct struct_item
{
char item1[SIZE + 1];
struct struct_item* next_item;
}
// later... dynamically allocate hashtable
hashtable = calloc(sizevar, sizeof(struct_item);
// later, inside of a loop...
// alloc struct item to go into array/linked list (valgrind error happening here)
struct_item* an_item = calloc(1, sizeof(struct_item);
// after setting appropriate values in 'an_item', add struct to hashtable
hashtable[0] = an_item;
// after all is said and done, free the current (remaining) struct_item
// (edit to fix: wasn't struct_item; should've been an_item)
//free(struct_item);
free(an_item);
我没有在循环中释放任何其他struct_items calloc'd;只是最后一个。但是,只要我释放那个,它的值就会从哈希表中消失。
理想情况下,我想我会释放每个calloc'd struct_items,是吗? Valgrind只报告一个问题,位于我正在调用'an_item'的行。
所以,再次,我如何让calloc'd项与哈希表保持关联,这样我可以释放'an_item'而不会从表中消失数据?我错过了什么?
编辑添加注释:当我卸载哈希表/链表时,我释放了struct_items!
答案 0 :(得分:1)
发现它!
我在卸载期间释放链表中的所有内容 - 但不是当前哈希表索引中的实际项目!
一旦我正确地释放了哈希表[i],我收到了快乐的报告:
==6759==
==6759== HEAP SUMMARY:
==6759== in use at exit: 0 bytes in 0 blocks
==6759== total heap usage: 143,130 allocs, 143,130 frees, 14,883,824 bytes allocated
==6759==
==6759== All heap blocks were freed -- no leaks are possible
==6759==
==6759== For counts of detected and suppressed errors, rerun with: -v
==6759== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
答案 1 :(得分:0)
此行存在问题
// after all is said and done, free the current (remaining) struct_item
free(struct_item);
更改为'an_item'包含calloc返回的地址
free(an_item);