我有两个结构
struct obj_t {
int id;
float x;
float y;
};
struct cluster_t {
int size;
int capacity;
struct obj_t *obj;
};
如您所见,指向obj_t
cluster_t
的指针
我想要做的是从cluster_t
中的数组中释放每个obj_t我是否必须使用这样的for
循环编写它?
void clear_cluster(struct cluster_t *c)
{
for(int i = 0; i<c->size;i++)
{
free(&c->obj[i]);
}
free(c->obj);
}
或者可以像这样释放内存吗?
void clear_cluster(struct cluster_t *c)
{
free(c->obj);
}
答案 0 :(得分:4)
每个free()
应该有一个malloc()
,并按照分配的相反顺序执行。
obj
的字段cluster_t
是指向object_t
数组的指针。在初始化malloc()
(类似cluster_t
)时,可能会分配一个c->obj = malloc(c->capacity*sizeof(*c->obj))
,因此只需通过一次调用free()
即可释放它。然后,您需要释放cluster_t
分配本身(假设它也是动态分配的):
free(c->obj);
free(c);
但是,如果每个 object_t
本身都有动态分配,则会有所不同。 (在您的示例中,object_t
没有。)在这种情况下,您需要在创建数组时迭代数组并malloc()
分配,因此执行相反的操作{{1每一个都在最后。
答案 1 :(得分:2)
这取决于你的分配方式。看起来你做了像
这样的事情struct cluster_t cluster;
cluster.obj = malloc(sizeof (struct obj_t) * SOMENUMBER);
在这种情况下,cluster.obj
只是一个指向数组的指针。您需要做的就是
free(cluster.obj)
或
free(c->obj)
在该函数中接收指向c
的指针。
如果你有一个指针数组,你只需要遍历调用free
的数组。
请记住&
获取变量的内存地址。你没有释放指针,你释放了指针指向的内存。你永远不会做free(&pointer)
之类的事情。