[libft] ft_lstclear
lstclear?
typedef struct s_list
{
void *content;
struct s_list *next;
} t_list;
//원 함수 없음
void ft_lstclear(t_list **lst, void (*del)(void *));
구현해야할 함수 기능
: Deletes and frees the given element and every successor of that element, using the function ’del’ and free(3). Finally, the pointer to the list must be set to NULL.
해석 및 부연설명
: 두 번째 매개변수로 받은 del
함수를 이용해 리스트의 모든 원소들을 free
하고 삭제한다.
ex)
static void ft_del(void *content)
{
free(content);
}
int main(void)
{
t_list *list1;
t_list *list2;
t_list *list3;
list1 = ft_lstnew(ft_strdup("abcde"));
list2 = ft_lstnew(ft_strdup("12345"));
list3 = ft_lstnew(ft_strdup("!@#$"));
list1->next = list2;
list2->next = list3;
ft_lstclear(&list1, &ft_del);
}
코드 실행 결과
// valgrind로 검사한 결과
==30970== HEAP SUMMARY:
==30970== in use at exit: 0 bytes in 0 blocks
==30970== total heap usage: 6 allocs, 6 frees, 65 bytes allocated
==30970==
==30970== All heap blocks were freed -- no leaks are possible
할당되었던 메모리들이 정상적으로 free
되었다.
의문점 및 생각해볼점
딱히 없다.
ft_lstclear 구현
void ft_lstclear(t_list **lst, void (*del)(void *))
{
t_list *cur;
while (*lst)
{
cur = *lst;
*lst = (*lst)->next;
ft_lstdelone(cur, del);
}
*lst = NULL;
}
리스트를 돌면서 lst->content와 lst를 차례대로 free
해주면 끝이다. 이 때 free
하기 전에 다음 원소로 넘어가는 작업도 필요하므로 임시로 쓸 cur 리스트를 만들어 활용했다.