C-释放结构内部结构的阵列



我有两个结构

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()

<</p>

这取决于您的分配方式。看来您做了类似

的事情
struct cluster_t cluster;
cluster.obj = malloc(sizeof (struct obj_t) * SOMENUMBER);

在这种情况下,cluster.obj只是一个数组的指针。您需要做的就是

free(cluster.obj)

free(c->obj)

在接收到c的指针的该功能中。

,如果您有一系列指针,则只需迭代调用free的数组。

请记住,&采用该变量的内存地址。您没有释放指针,可以释放指针指向的内存。您永远不会做诸如free(&pointer)

最新更新