free()

时间:2015-12-06 09:04:30

标签: c memory-management

我试图了解C中的动态内存分配是如何工作的。所以我编码了这个:

typedef struct person{
    int id;
    int credit;
}person_t;

typedef struct list{
    int id;
    person_t * people;
}list_t;

int main(){
list_t * list;
list = malloc(sizeof(list_t));
list->people = malloc(10 * sizeof(person_t)); //list for 10 people

free(list->people);
free(list);
}

,这似乎是正确的。但是,当我决定为allocate \ deallocation创建函数时,会出现双重释放或损坏错误:

void init_list(list_t * listptr, int size){
    listptr = malloc(sizeof(list_t));
    listptr->people = malloc(size * sizeof(person_t));
}

void clear_list(list_t * listptr){
    free(listptr->people);
    free(listptr);
}

int main(){
list_t list;
init_list(&list, 10); //list for 10 people
clear_list(&list);
}

输出:

Error in ./list: double free or corruption (out) : 0x00007ffc1b3fba70

为什么会这样?提前谢谢。

1 个答案:

答案 0 :(得分:1)

void init_list(list_t * listptr, int size){
    listptr = malloc(sizeof(list_t));
    listptr->people = malloc(size * sizeof(person_t));
}

不正确。您正在修改函数中的listptr。这不会改变listmain的任何内容。您需要删除该函数中更改listptr的行。使用:

// listptr is already a valid pointer.
// There is no need to allocate memory for it.
void init_list(list_t * listptr, int size){
    listptr->people = malloc(size * sizeof(person_t));
}

clear_list中有一个更糟糕的错误。

void clear_list(list_t * listptr){
    free(listptr->people);
    free(listptr);
}

您正在通过调用free未分配的指针调用malloclistptr是指向main中堆栈中创建的对象的指针。删除对free的第二次调用。使用:

// listptr is a pointer to an object on the stack in main.
// Trying to call free on it is an error.
void clear_list(list_t * listptr){
    free(listptr->people);
}