我正在编写一个基于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属性,但我只想确保如果是这样的话。
答案 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}}