我对C
和malloc
比较陌生。我写了一个lib
,里面有一些基本的函数,我一边写一边用新的函数来填充,我正在把这些函数用于像这个这样的其他小项目。
我听说了Valgrind,决定用它检查我的程序,但不太明白为什么我有这么多leaks
,当使用malloc
本身的函数时,我觉得我所有的mallocs
都受到了if (line == NULL)
的保护。
你们能让我回到正轨吗?
static char *concator(char *s1, char *s2, size_t len)
{
char *line;
size_t size;
if (!s1 || !s2)
return (NULL);
size = strlen(s1) + strlen(s2);
line = (char*)memalloc(sizeof(char) * size + 1);
if (line == NULL)
return (NULL);
strcpy(line, s1);
strncat(line, s2, len);
strdel(&s1);
return (line);
}
int line_reader(const int fd, char **line)
{
static char buf[BUFF_SIZE];
char *pos;
int ret;
if (fd < 0 || !line || read(fd, buf, 0) < 0 || BUFF_SIZE < 1)
return (-1);
*line = strnew(0);
if (line == NULL)
return (-1);
while (1)
{
pos = strchr(buf, 'n');
if (pos)
{
*line = concator(*line, buf, pos - buf);
if (line == NULL)
return (-1);
strncpy(buf, &buf[pos - buf + 1], BUFF_SIZE - (pos - buf));
return (1);
}
*line = concator(*line, buf, BUFF_SIZE);
if (line == NULL)
return (-1);
ret = read(fd, buf, BUFF_SIZE);
buf[ret] = ' ';
if (!ret)
return ((**line) ? 1 : 0);
}
}
使用完line
后即可免费使用,如:
char* line;
int rc = line_reader(fd, &line);
if(rc > 0)
{
//use line
printf("%sn", line);
//then free it
free(line);
}
这应该可以修复valgrind报告的内存泄漏问题。但是,请注意评论中提到的其他错误。