数组存储数据结构的C存储器解除分配

km0tfn4u  于 2023-03-22  发布在  其他
关注(0)|答案(3)|浏览(242)

我正在编写一个基于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_idattrdatastacksize 也将被释放,或者我必须单独释放它们,然后从数组中释放结构。
对我来说,如果我在这样一个结构上使用free(),那么其中包含的所有数据都将被释放,我不必显式地释放每个结构属性,但我只是想确定情况是否如此。

umuewwlo

umuewwlo1#

对于动态分配的“结构”(即数组、结构体等的层次结构),需要从“自底向上”调用free,可以将此操作视为执行树的深度优先遍历。
通常的限制适用于指向堆栈上内存的变量,而不是堆。例如,用type[n]char[n] = 'abc'等定义的变量与使用*alloc系列函数从堆中分配的变量。还要注意有多个指针指向同一地址的情况。在这些上调用free两次是编程错误(尽管不一定是分段错误)。

js81xvg6

js81xvg62#

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

a8jjtwal

a8jjtwal3#

你需要用malloc()free()所有显式分配的数据。对malloc()的每个调用都与对free()的调用进行了虚拟镜像。
基本上,你可以定义一个constructor()函数来分配structre中的结构和数据,以及一个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;
}

相关问题