释放包含动态缓冲区的动态缓冲区中的内存

时间:2013-11-01 19:11:22

标签: c malloc free

说我有:

char **search_terms = malloc(sizeof(char *) * number_search_terms);
for (i=0; i < number_search_terms; i++)
    search_terms[i] = malloc(MAX_LINE_LEN);

当我释放这段记忆时,是否足够

free(search_terms)

或者我必须首先释放缓冲区中的每个元素,如下所示:

for (i=0; i < number_search_terms; i++)
    free(search_terms[i]);
free(search_terms);

2 个答案:

答案 0 :(得分:3)

您必须先释放每个缓冲区,然后释放更大的缓冲区。 free将永远不会遍历树,以查看您的部分数据是否恰好是指向其他malloc ed数据的指针。

答案 1 :(得分:2)

free不了解您的数据结构。你传递了一块以前用malloc(或callocrealloc)分配的内存块,它释放了那块内存而没有别的。

因此,为避免内存泄漏,您必须与free完全一样调用malloc。这有两个原因:

  1. 在C中,堆上管理的内存(mallocfree)主要被视为黑盒子。该语言中没有允许库函数知道您存储在内存中的内容的机制,因此free无法为您遍历数组。

  2. 自动遍历数据结构为您做出策略决策:数据结构的组件被视为一个整体,应作为一个整体释放。一般情况下,情况并非如此,C避免为您做出这些决定。例如,出于性能原因,您的子字符串可能被分配为一个大的,连续的块,您可以一次释放。 C允许您在此方面具有很大的灵活性,但它还要求您主动管理堆内存。