如何在不从哈希表/链表中删除值的情况下释放calloc' d指针?

时间:2014-03-23 04:57:12

标签: c arrays pointers hashtable calloc

我正在使用链接列表设置和加载哈希表。对于每个项目,我调用一个结构指针,然后将该项输入数组本身,或者如果采用数组索引则输入相关的链接列表。

所有作品都很精美,但是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!

2 个答案:

答案 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);