Я только собираюсь устранить утечки в вашей программе: Первая в этой строке:
*line = ft_strjoin(*line ,buff);
Что происходит, так как возвращаемое значение вашего ft_strjoin - это *line
, старый адрес памяти, на который *line
использовался для указания, теряется без освобождения и теперь *line
указывает на другой адрес памяти (тот, который содержит *line + buff
).
У вас есть два способа исправить эту проблему:
Первый - сделать что-то вроде этого:
char *to_free = *line;
*line = ft_strjoin(*line, buff);
free(to_free);
Это сделает to_free точкой одинаковойадрес памяти, на который указывает *line
до того, как будет изменен вызовом на ft_strjoin
. Другой способ (на мой взгляд, лучший) - реализовать ft_strjoin
, который принимает трехмерный аргумент, например int n
, если n = 1
вы освобождаете первый аргумент ft_strjoin
, если n = 2
, вы освобождаете2-й аргумент, если n = 3
вы освободите оба (будьте осторожны с тем, где вы освобождаете их внутри своей функции).
if (rem)
может вернуть true, даже если вы освободите его, потому что вы не сделалипотом делать rem = NULL
явно (Вы также звоните printf
, чтобы напечатать rem
после вашего бесплатного rem
.
Последняя проблема заключается в том, что вы нигде не освобождаете buff
. Вы должны освободить его перед выходом из get_next_line
.