释放struct中的结构数组

时间:2016-12-03 18:08:05

标签: c arrays memory struct free

我有两个结构

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);
}

2 个答案:

答案 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)之类的事情。