1

说我有:

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);
4

2 回答 2

3

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

于 2013-11-01T19:12:39.570 回答
2

free不了解您的数据结构。您将之前使用malloc(或callocrealloc)分配的内存块传递给它,它会释放该内存块,仅此而已。

因此,为避免内存泄漏,您必须freemalloc. 有两个原因:

  1. 在 C 中,堆上管理的内存(使用mallocfree)在很大程度上被视为黑盒。语言中没有任何机制可以让库函数知道您存储在内存中的内容,因此free无法为您遍历数组。

  2. 自动遍历数据结构会为您做出策略决策:数据结构的组件被视为一个整体,应该作为一个整体被释放。一般来说,这是不正确的,C 会避免为您做出这些决定。例如,出于性能原因,您的子字符串可能会被分配为您一次释放的大的连续块。C 在这方面为您提供了很大的灵活性,但它也需要您主动管理堆内存。

于 2013-11-01T19:22:46.807 回答