2015-11-03 1 views
0

У меня есть связанный список пользователей, таким образом, я сделал эту функцию, удалить пользователя из связанного списка:Бесплатный переменный malloc и возврат в функцию в c?

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;} 

У меня есть таНос «save_users», но мне нужно, чтобы вернуть это значение. Мой вопрос: как освободить эту переменную?

Спасибо

ответ

1

вы можете просто позвонить бесплатно(), но было бы лучше практика, чтобы обеспечить другую функцию в вашем API под названием что-то вроде free_save_users() и звоните бесплатно() в этой функции, в случае, если вы когда-либо необходимо изменить способ распределения памяти.

+0

Спасибо за ваш ответ. Но где я могу назвать free()? Я не могу назвать это в функции, и когда я вызываю функцию, я потерял save_users. – ImbaBalboa

+0

вы бы захватили память, возвращенную из этой функции, в переменную: 'puser * the_users = delete_users();' а затем вы передадите память в free(): 'free (the_users);' – kcraigie

+1

Спасибо, я понял! – ImbaBalboa

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 вы выделяемой в функции. Вам больше не нужно освобождать save_user. Вместо этого вы освобождаете старый list_user.

Очевидно, что свободная должна быть функцией, которая может освободить вашу структуру данных.

Смежные вопросы