Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何释放指向指针的指针,从而释放其中的所有元素?_C_Loops_Pointers_Free - Fatal编程技术网

C 如何释放指向指针的指针,从而释放其中的所有元素?

C 如何释放指向指针的指针,从而释放其中的所有元素?,c,loops,pointers,free,C,Loops,Pointers,Free,我正在处理一个哈希表数据结构,遇到了一个内存泄漏问题。基本上我有这个代码: int main(int argc, char const *argv[]) { // -----------------------------+ // record 0 | // -----------------------------+ rec_t *r = malloc(sizeof(rec_t));

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

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;
}
我如何用“一枪”释放所有元素我查看了这个链接,但没有帮助-

我想强调的是,我不想在所有元素中循环并逐个释放

我不想遍历所有元素并逐个释放它们

太糟糕了

如果您为它们分配了对
malloc
的单独调用,则必须通过对
free
的单独调用释放它们

另一种方法是使用类似于from LibAPR的东西,这是一个池分配器,可以让您一次释放整个池。但对于一个简单的普通问题,这是一个相当激进的解决方案

我不想遍历所有元素并逐个释放它们

太糟糕了

如果您为它们分配了对
malloc
的单独调用,则必须通过对
free
的单独调用释放它们

另一种方法是使用类似于from LibAPR的东西,这是一个池分配器,可以让您一次释放整个池。但对于一个简单、普通的问题,这是一个相当激进的解决方案。

简短回答:

没有默认的一次性方法,您必须对内存分配器函数返回的所有指针调用
free()
(无论您喜欢与否)

详细说明:

但是,您可以更改数据结构,使其包含一个成员来保存分配调用的数量,并使用该值在循环中分配(和取消分配)内存。差不多

 dict->numRecords = n;

 // allocate, use, something else......

 for (int i = 0; i < dict->numRecords; i++)
      free (dict->(records[i]) );
dict->numRecords=n;
//分配、使用、其他。。。。。。
对于(int i=0;inumRecords;i++)
免费(dict->(记录[i]);
请注意,在后面的方法中,您也在一个接一个地释放元素,我们只是使用循环使代码简洁。

简短回答:

没有默认的一次性方法,您必须对内存分配器函数返回的所有指针调用
free()
(无论您喜欢与否)

详细说明:

但是,您可以更改数据结构,使其包含一个成员来保存分配调用的数量,并使用该值在循环中分配(和取消分配)内存。差不多

 dict->numRecords = n;

 // allocate, use, something else......

 for (int i = 0; i < dict->numRecords; i++)
      free (dict->(records[i]) );
dict->numRecords=n;
//分配、使用、其他。。。。。。
对于(int i=0;inumRecords;i++)
免费(dict->(记录[i]);

请注意,在后面的方法中,您也在一个接一个地释放元素,我们只是使用循环使代码简洁。

您不能。显然,您需要
malloc
多个块,因此必须
释放每个块。但是,既然你有固定宽度的内部数组,为什么不在
结构
本身中使用2D数组呢?如果你永远不必
动态地释放
malloc
更多内存,那么懒惰的方法就是不
释放
任何内存,并在程序退出时将内存交还给系统。这很糟糕。因为内存泄漏。不是在我的系统上。所有分配的内存都返回给操作系统。但正如我所说,在动态环境下不起作用。哦,对不起,我没听清你说的话。是的,我知道非动态分配的内存会返回给系统,因为当堆栈帧被“销毁”时,在堆栈上分配的东西将完全消失。这对我来说并不理想,因为我需要保存对内存地址的引用,在函数返回后内存地址将包含垃圾数据。你不能。显然,您需要
malloc
多个块,因此必须
释放每个块。但是,既然你有固定宽度的内部数组,为什么不在
结构
本身中使用2D数组呢?如果你永远不必
动态地释放
malloc
更多内存,那么懒惰的方法就是不
释放
任何内存,并在程序退出时将内存交还给系统。这很糟糕。因为内存泄漏。不是在我的系统上。所有分配的内存都返回给操作系统。但正如我所说,在动态环境下不起作用。哦,对不起,我没听清你说的话。是的,我知道非动态分配的内存会返回给系统,因为当堆栈帧被“销毁”时,在堆栈上分配的东西将完全消失。这对我来说并不理想,因为我需要保存对内存地址的引用,在函数返回后内存地址将包含垃圾数据。尽管如果存储的记录是按顺序存储的,那么这将起作用。哈希表的情况并非如此。我给出的索引只用于测试。我有一个散列函数,它对键进行散列并将它们存储在索引中。i、 e.'asd'=23I可以将使用过的索引存储在一个数组中,并在其中循环。我想我会这么做的。嗯,这是一个有趣的想法。尽管如果存储的记录是按顺序存储的,那么这将起作用。哈希表的情况并非如此。我给出的索引只用于测试。我有一个散列函数,它对键进行散列并将它们存储在索引中。i、 e.'asd'=23I可以将使用过的索引存储在一个数组中,并在其中循环。我想我会这么做的。