free()的指针结构,一个结构里面(Free() pointer to Struct, insid

2019-10-21 09:56发布

我似乎无法找到如何自由()的子结构。

结构:

typedef struct
{
    char ID[5];
    location *loc;
} observer;

typedef struct
{
    double lat;
    double lng;
} location;

我的免费()的包装是:

void free_obs_list_node(void *data)
{
    free(*(observer **)data);
}

我可以免费观察者结构。 我不能释放的指针位置结构。 这是我的问题:我该如何释放location结构的指向location *loc;

我用的包装纸free()因为这些节点在一个通用的链接列表。

Answer 1:

free功能需要一个void*为参数,使投不计数。 你只需要提供一个指向要释放内存位置:

free(data->loc);


Answer 2:

你不能自由loc您已释放observer ,但你释放之前loc是一个公平的游戏:

void free_obs_list_node(void *data) {
    observer **p = data;
    free((*p)->loc);
    free(*p);
    *p = NULL;
}

当然,这假设你传递一个指针的指针来observer里面void* data 。 由于唯一正当理由传递一个指针的指针成释放所指向的指针的函数是有指针设置为NULL ,我添加了最后一行空出*p

目前还不清楚,但是,为什么你传递void * ,而不是observer **



Answer 3:

您应该确保数据是不是在你的代码无效,或访问一个空指针时,你可以很容易地得到了一个段故障。

我不明白为什么你用一个双指针,它使代码更复杂和容易出现的错误。 下面的代码应该工作:

void free_obs_list_node(void *data)
{
    observer **ob = (observer **)data;// do not understand why you use a double pointer, it makes code much more complex and bug prone
    if(NULL == ob || NULL == *ob)
        return;
    if(NULL != (*ob)->loc)
        free((*ob)->loc);
    free(*ob);
}


文章来源: Free() pointer to Struct, inside a Struct