首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C双重释放问题

C双重释放问题
EN

Stack Overflow用户
提问于 2010-12-16 05:25:17
回答 3查看 1.7K关注 0票数 1

我遇到了一个双重释放,我看不到它发生在哪里。下面代码的目的是从链表中删除Person节点。

代码语言:javascript
复制
typedef struct person {
    char *first ;
    char *last ;
    char *location ;
    struct person *next_person ;
} person ;

struct person_list {
    int num_persons ;
    person *first_person ;
} person_list ;

extern struct person_list person_list ;

void free_person(person *person) {
    free(person->first);
    person->first = NULL;

    free(person->last);
    person->last = NULL;

    free(person->location);
    person->location = NULL;

    free(person);
    person = NULL;
}

...

    if (person_list.num_persons > 0) {
        while (person_list.num_persons > 0) {
            //Iterate to the end of the chain.
            cur_person = person_list.first_person;

            while (cur_person->next_person != NULL) {
                cur_person = cur_person->next_person;
            }

            free_person(cur_person);
            person_list.num_persons--;
        }
    }

...
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-16 05:27:42

释放人员时,不会将前一个人员的next_person指针设置为NULL。因此,它指向已释放的内存,这就是您双倍释放内存的原因。

您需要跟踪在您想要释放的人之前到来的人,并将其next_person指针设置为NULL

编写循环的另一种更有效的方法是如下所示,它不会出现相同的错误:

代码语言:javascript
复制
    // Grab the first person
    cur_person = person_list.first_person;

    // Make sure there is someone to free
    while (cur_person != NULL) {
        // Keep track of who to free next
        nxt_person = cur_person->next_person;

        free_person(cur_person);

        // Get the next person in line
        cur_person = nxt_person;
    }

    // Didn't we just remove them all? Yes, we did.
    person_list.num_persons = 0;
    // Let's not forget to set that we have no one left
    person_list.first_person = NULL;
票数 5
EN

Stack Overflow用户

发布于 2010-12-16 05:32:41

代码语言:javascript
复制
void free_person(person *person) {
    /* ... */
    free(person);
    person = NULL;
}

这只会将本地person设置为NULL;对调用例程上的人员没有任何更改。

票数 1
EN

Stack Overflow用户

发布于 2010-12-16 05:34:11

free_person函数中,对NULL的赋值实际上并不是必需的,因为您还释放了包含结构。否则,就有必要防止出现dangling pointer

此外,person = NULL只分配函数的本地参数,该参数在函数返回后立即丢失。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4455046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档