如何释放指向指针的指针,以便释放其中的所有元素?

时间:2016-12-22 19:58:26

标签: c loops pointers free

我正在研究哈希表数据结构,并且我遇到了内存泄漏问题。基本上我有这个代码:

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

我想强调一点,我不想遍历所有元素并逐一释放。

2 个答案:

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

注意,你在后面的方法中逐个释放元素,我们只是使用循环使代码简洁。