【问题标题】:C memory deallocation of array stored data structures数组存储数据结构的 C 内存释放
【发布时间】:2012-06-13 15:21:38
【问题描述】:

我正在编写一个基于 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(),那么其中包含的所有数据都将被释放,我不必显式释放每个结构属性,但我只是想确定一下是这样的。

【问题讨论】:

  • my_array 类型为thread_info[] 还是thread_info*
  • thread_info *registry = NULL;

标签: c memory ansi realloc


【解决方案1】:

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

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

【讨论】:

  • 顺序很重要,因为如果您释放指向更多分配内存地址的指针,则该分配的内存将不再可访问(除非您有另一个指向它的指针)。本质上,如果你有一个void** foo 分配给malloc() (等等),你必须在free(*foo) 之前分配free(**foo)
  • @DanatheSane 我突然在脑海中弹出一个带有明显答案的问题,然后我看到了你的答案,所以再次向读者提问**为什么顺序很重要**?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您需要使用malloc() free() 所有明确分配的数据。对malloc() 的每次调用实际上都与对free() 的调用相同。

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

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 2017-06-04
      • 1970-01-01
      • 2019-03-11
      • 2021-08-26
      • 1970-01-01
      相关资源
      最近更新 更多