C内存释放数组存储的数据结构

时间:2012-06-13 15:21:38

标签: c memory ansi realloc

我正在编写一个基于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()调用deallocate内存不仅会被结构使用,还会使用其中的所有数据类型,即。 * thread_id *, attr 数据 stacksize 也将被解除分配,或者我必须单独解除分配它们然后从中取消分配结构数组。

对我而言,如果我在这样的结构上使用free()将会释放其中包含的所有数据并且我不必显式释放每个struct属性,但我只想确保如果是这样的话。

3 个答案:

答案 0 :(得分:3)

您必须显式释放结构中的资源,然后才能释放结构本身。如果只取消分配结构,那么内部的资源将不会被释放,你将泄露它们。

答案 1 :(得分:3)

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

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

答案 2 :(得分: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; } 函数来解除分配它。这可能类似于以下代码段:

{{1}}