说我有:
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);
答案 0 :(得分:3)
您必须先释放每个缓冲区,然后释放更大的缓冲区。 free
将永远不会遍历树,以查看您的部分数据是否恰好是指向其他malloc
ed数据的指针。
答案 1 :(得分:2)
free
不了解您的数据结构。你传递了一块以前用malloc
(或calloc
或realloc
)分配的内存块,它释放了那块内存而没有别的。
因此,为避免内存泄漏,您必须与free
完全一样调用malloc
。这有两个原因:
在C中,堆上管理的内存(malloc
和free
)主要被视为黑盒子。该语言中没有允许库函数知道您存储在内存中的内容的机制,因此free
无法为您遍历数组。
自动遍历数据结构为您做出策略决策:数据结构的组件被视为一个整体,应作为一个整体释放。一般情况下,情况并非如此,C避免为您做出这些决定。例如,出于性能原因,您的子字符串可能被分配为一个大的,连续的块,您可以一次释放。 C允许您在此方面具有很大的灵活性,但它还要求您主动管理堆内存。