我正在编写一个基于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,attr,data 和 stacksize 也将被释放,或者我必须单独释放它们,然后从数组中释放结构。
对我来说,如果我在这样一个结构上使用free()
,那么其中包含的所有数据都将被释放,我不必显式地释放每个结构属性,但我只是想确定情况是否如此。
3条答案
按热度按时间umuewwlo1#
对于动态分配的“结构”(即数组、结构体等的层次结构),需要从“自底向上”调用free,可以将此操作视为执行树的深度优先遍历。
通常的限制适用于指向堆栈上内存的变量,而不是堆。例如,用
type[n]
,char[n] = 'abc'
等定义的变量与使用*alloc
系列函数从堆中分配的变量。还要注意有多个指针指向同一地址的情况。在这些上调用free
两次是编程错误(尽管不一定是分段错误)。js81xvg62#
你必须显式释放结构体内部的资源,然后才能释放结构体本身。如果你只释放结构体,内部的资源不会被释放,你会泄漏它们。
a8jjtwal3#
你需要用
malloc()
来free()
所有显式分配的数据。对malloc()
的每个调用都与对free()
的调用进行了虚拟镜像。基本上,你可以定义一个
constructor()
函数来分配structre中的结构和数据,以及一个destructor()
函数来释放它,这可能类似于下面的代码片段: