2016-12-03 54 views
0

结构的数组我有两个结构解放出来的内部结构

struct obj_t { 
    int id; 
    float x; 
    float y; 
}; 

struct cluster_t { 
    int size; 
    int capacity; 
    struct obj_t *obj; 
}; 

正如你所看到的,有指向第一obj_tcluster_t

我想要做的是摆脱内部阵列每obj_t cluster_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); 
} 
+1

按照您分配的顺序进行反转。 –

+1

*“正如你可以看到'obj_t'数组在'cluster_t'内*” - 我看不到'cluster_t'内的任何数组。我可以看到一个指针,但这是一个不同的事情。 – axiac

+0

在'struct'中没有指向数组的指针! – Olaf

回答

3

您应该有一个free()您的每个malloc(),并按照与其分配的顺序相反的顺序执行。

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

+1

@HynekBernard'struct cluster_t'还具有成员'int size'和'int capacity',这表明分配给成员'struct obj_t * obj'的内存可能会用'realloc()'扩展一次或多次。这算作一个单独的分配,只需要一个“免费”。 –

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)这样的事情。