1

我正在编写一个基于 C 的库,在使用free()释放内存块时我有点困惑......基本上我有几个类似的结构是这样定义的:

typedef struct
{
    pthread_t thread_id;
    pthread_attr_t attr;
    void     *data;
    size_t stacksize = NULL;
} thread_info;

我基本上用来realloc()为这个结构分配内存并有一个指向它的数组。

我的问题是,如果我使用:

free(my_array[thread_index]); 

free()调用是否会释放不仅由结构使用的内存,而且会释放其中所有数据类型使用的内存,即。*thread_id*、attrdatastacksize也将被释放,或者我必须单独释放它们,然后从数组中释放结构。

对我来说,如果我free()在这样的结构上使用它是有道理的,其中包含的所有数据都将被释放,我不必显式地释放每个结构属性,但我只想确定是否是这种情况。

4

3 回答 3

3

您必须显式释放结构内的资源,然后才能释放结构本身。如果你只释放结构,里面的资源不会被释放,你会泄漏它们。

于 2012-06-13T15:24:42.907 回答
3

对于动态分配的“结构”(即数组、结构等的层次结构),您需要从“自下而上”对每个指针调用 free。您可以将此操作视为执行树的深度优先遍历。

通常的限制适用于指向堆栈而不是堆内存的指针的变量。例如,用 , 等定义的变量与type[n]使用函数族char[n] = 'abc'从堆中分配。*alloc还要注意有多个指向同一地址的指针的情况,free在这些上调用两次是一个编程错误(尽管不一定是分段错误)。

于 2012-06-13T15:24:53.860 回答
1

您需要free()使用malloc(). 每次调用malloc()实际上都与调用free().

基本上,您可以定义一个constructor()函数来分配结构和结构内的数据,以及destructor()释放它的函数。这可能类似于以下代码片段:

int32_t         constructor(thread_info **t)
{
  if (NULL == (*t = malloc(sizeof (thread_info)))) {
    return -1;
  }

  if (NULL == ((*t)->data = malloc(sizeof (__data__)))) {
    return -1;
  }

  return 0;
}

int32_t         destructor(thread_info *t)
{
  if (free(t->data)) {
    return -1;
  }

  if (free(t)) {
    return -1;
  }

  return 0;
}
于 2012-06-13T15:45:07.380 回答