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可以将使用过的索引存储在一个数组中,并在其中循环。我想我会这么做的。