我有两个结构
struct obj_t {
int id;
float x;
float y;
};
struct cluster_t {
int size;
int capacity;
struct obj_t *obj;
};
如您所见,cluster_t
内部有obj_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);
}
您拥有的每个malloc()
都应该有一个free()
,并以相反的顺序分配。
cluster_t
的字段obj
是指向object_t
数组的指针。初始化cluster_t
(类似于c->obj = malloc(c->capacity*sizeof(*c->obj))
)时,这可能是用一个malloc()
分配的,因此只需要释放一个呼叫free()
即可释放。然后,您需要释放cluster_t
分配本身(假设它也是动态分配的):
free(c->obj);
free(c);
但是,如果每个每个 object_t
本身都具有动态分配。(在您的示例中,object_t
没有。)在这种情况下,您需要在创建数组时通过数组和malloc()
迭代分配,因此在末端进行反向和free()
。
这取决于您的分配方式。看来您做了类似
的事情struct cluster_t cluster;
cluster.obj = malloc(sizeof (struct obj_t) * SOMENUMBER);
在这种情况下,cluster.obj
只是一个数组的指针。您需要做的就是
free(cluster.obj)
或
free(c->obj)
在接收到c
的指针的该功能中。
,如果您有一系列指针,则只需迭代调用free
的数组。
请记住,&
采用该变量的内存地址。您没有释放指针,可以释放指针指向的内存。您永远不会做诸如free(&pointer)
。