在C语言中,我有这样的东西:
typedef struct bucket {
int value;
struct bucket *next;
} Bucket;
typedef struct table {
int size;
Bucket **buckets;
} Table;
现在我做Table *t = malloc(sizeof(Table));
和t->buckets = calloc(10, sizeof(Bucket));
释放表 *t 是free(t)
; 对吗?
现在,我如何能够释放存储桶链表和每个节点?
你应该以
对称的方式为每个malloc
/calloc
有一个相应的free
调用:
Table *t = malloc(sizeof(Table));
t->buckets = calloc(10, sizeof(Bucket));
...
free(t->buckets);
free(t);
如果您错过了释放t->buckets
,您将泄漏内存,因为 Table
结构仅包含指向存储桶的指针,不包含它们。编译器也不会为您插入它。
可能出错的另一件事是释放节点,然后尝试访问下一个节点,因此您需要先保存下一个指针。
Bucket *bptr, *next;
bptr = *t;
while (bptr) {
next = bptr->next;
free(bptr);
bptr = next;
}
free(t);
t=NULL;