我遇到了一个双重释放,我看不到它发生在哪里。下面代码的目的是从链表中删除Person节点。
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--;
}
}
...发布于 2010-12-16 05:27:42
释放人员时,不会将前一个人员的next_person指针设置为NULL。因此,它指向已释放的内存,这就是您双倍释放内存的原因。
您需要跟踪在您想要释放的人之前到来的人,并将其next_person指针设置为NULL。
编写循环的另一种更有效的方法是如下所示,它不会出现相同的错误:
// 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;发布于 2010-12-16 05:32:41
void free_person(person *person) {
/* ... */
free(person);
person = NULL;
}这只会将本地person设置为NULL;对调用例程上的人员没有任何更改。
发布于 2010-12-16 05:34:11
在free_person函数中,对NULL的赋值实际上并不是必需的,因为您还释放了包含结构。否则,就有必要防止出现dangling pointer。
此外,person = NULL只分配函数的本地参数,该参数在函数返回后立即丢失。
https://stackoverflow.com/questions/4455046
复制相似问题