我有一个用户链表,因此我已经完成了这个从链表中删除用户的功能:
puser* delete_user(puser* list_users, int fd_to_delete) {
puser *save_users;
save_users = (puser *)malloc(sizeof(puser));
save_users = list_users;
int nb_users = 0;
nb_users = count_user(list_users);
// only one user
if(nb_users == 1)
free(list_users);
return NULL;
// several users
if(nb_users > 0) {
// if it's the first user of the list
if(user_get_fd(list_users) == fd_to_delete)
return user_get_next_one(list_users);
// else
while(list_users != NULL) {
if(user_get_next_one(list_users) != NULL) {
if(user_get_fd(user_get_next_one(list_users)) == fd_to_delete)
list_users->next_client = user_get_next_one(user_get_next_one(list_users));
}
list_users = user_get_next_one(list_users);
}
return save_users;
}
return save_users;}
我有malloc" save_users",但我需要返回此值。我的问题是如何释放这个变量?
谢谢
答案 0 :(得分:1)
你可以调用free(),但更好的做法是在你的api中提供另一个函数,例如free_save_users(),并在这个函数中调用free(),以防万一你需要改变内存的方式分配
答案 1 :(得分:0)
如果你想保持这种状态,你可以决定不返回puser *。
相反,你可以传递一个puser **,指向puser * list_user的位置。然后你可以在这一行中取消引用这个puser **:
save_users = *list_users;
在你的功能结束时,你可以释放(* list_user),设置* list_user = save_users。
所以:
puser * list_user ...;
delete_user(&list_user, ...);
现在是delete_user:
void delete_user(puser** list_user, ...){
puser * saved_user = malloc(...);
saved_user = *list_user;
... Do stuff to saved user ...
free(*list_user);
*list_user = saved_user;
}
现在,当您的函数退出时,list_user现在指向您在函数中分配的saved_user。您不再需要释放saved_user。你可以免费使用旧的list_user。
显然,free必须是一个可以释放数据结构的函数。