我正在研究哈希表数据结构,并且我遇到了内存泄漏问题。基本上我有这个代码:
int main(int argc, char const *argv[])
{
// -----------------------------+
// record 0 |
// -----------------------------+
rec_t *r = malloc(sizeof(rec_t));
r->key = "name";
r->value = "evgeny";
// -----------------------------+
// -----------------------------+
// record 1 |
// -----------------------------+
rec_t *r2 = malloc(sizeof(rec_t));
r2->key = "lastName";
r2->value = "Danilenko";
// -----------------------------+
// -------------------------------+
// dictionary struct |
// params : uint length |
// rec_t **records |
// -------------------------------+
dct_t* dict = malloc(sizeof(dct_t));
dict->records = malloc(sizeof(rec_t*) * 20);
dict->records[0] = r;
dict->records[1] = r2;
// free(dict->records[0]); // DONT WANT TO DO THIS! O(n)
// free(dict->records[1]);
free(*dict->records); // clears only 1st element cuz pointer
free(dict->records);
free(dict);
return 0;
}
我如何通过“一次拍摄”获得所有元素的免费()#? 我看了一下这个链接,但它没有帮助 - How to free a struct that contains only pointers
我想强调一点,我不想遍历所有元素并逐一释放。
答案 0 :(得分:4)
我不想循环遍历所有元素并逐一释放。
太糟糕了。
如果您通过单独调用malloc
为他们分配了这些内容,则必须通过单独调用free
来释放他们。
另一种方法是使用来自LibAPR的apr_pool_t
之类的东西,这是一个池分配器,可以让你一次释放整个池。但这对于一个简单的普通问题来说是一个相当激烈的解决方案。
答案 1 :(得分:1)
简答:
一次性方法没有默认方式,你必须在内存分配器函数返回的所有指针上调用free()
(无论你喜欢它吗?或不。)
精心:
但是,您可以更改数据结构以包含用于保存分配调用数的成员,并使用该值在循环中分配(和释放)内存。像
这样的东西 dict->numRecords = n;
// allocate, use, something else......
for (int i = 0; i < dict->numRecords; i++)
free (dict->(records[i]) );
注意,你在后面的方法中逐个释放元素,我们只是使用循环使代码简洁。