C中的内存泄漏

时间:2016-11-13 17:26:38

标签: c

在此功能中,我有内存泄漏

static int      read_buffer(int const fd, char **buffer)
{
        char    buff[BUFF_SIZE + 1];
        int     ret;

        ret = read(fd, buff, BUFF_SIZE);
        if (ret > 0)
        {
                buff[ret] = 0;
                if (!(*buffer = ft_strjoin(*buffer, buff)))
                        return (-1);
        }
        return (ret);
}

我试图再做一次这样的解决方案..但是我也得到了内存泄漏

static int      read_buffer(int const fd, char **buffer)
{
        char    buff[BUFF_SIZE + 1];
        char    *tmp;
        int     ret;

        ret = read(fd, buff, BUFF_SIZE);
        tmp = *buffer;
        if (ret > 0)
        {
                buff[ret] = 0;
                if (!(*buffer = ft_strjoin(*buffer, buff)))
                        return (-1);
                free(tmp);
        }
        return (ret);
}

这是ft_strjoin函数:(不能修改)

char    *ft_strjoin(char const *s1, char const *s2)
{
    size_t  size_s1;
    size_t  size_s2;
    char    *strjoin;

    size_s1 = ft_strlen(s1);
    size_s2 = ft_strlen(s2);
    if (!(strjoin = malloc(size_s1 + size_s2 + 1)))
        return (NULL);
    ft_strcpy(strjoin, s1);
    ft_strcat(strjoin, s2);
    return (strjoin);
}

我如何解决这个问题?
谢谢!

1 个答案:

答案 0 :(得分:0)

任何时候一个函数返回malloc内存,你就会有一个烫手山芋。你必须释放那个记忆而不能传递它,除非你已经证明你正在这样做。并且你必须在释放指针之前不要忘记(例如重用)指针。以下是我解释read_buffer()需要如何工作的方式。由于“缓冲区长度未知”,我假设它来自malloc,我们可以使用realloc

static int read_buffer(int const fd, char **buffer)
{
    char local_buffer[BUFF_SIZE + 1];

    int bytes_read = read(fd, local_buffer, BUFF_SIZE);

    if (bytes_read > 0)
    {
        local_buffer[bytes_read] = '\0';

        char *joined = ft_strjoin(*buffer, local_buffer);

        if (joined != NULL)
        {
            *buffer = realloc(*buffer, strlen(joined) + 1);

            if (*buffer != NULL)
            {
                ft_strcpy(*buffer, joined);
            }
            else
            {
                bytes_read = -1;
            }

            free(joined);
        }
        else {
            bytes_read = -1;
        }
    }

    return bytes_read;
}

请注意,您需要测试和恢复许多潜在的陷阱。

如果您直接从用户那里阅读,并且不想将换行符作为字符串串联的一部分,则可以替换此行:

     local_buffer[bytes_read] = '\0';

有类似的东西:

    if (local_buffer[bytes_read - 1] == '\n')
    {
        local_buffer[bytes_read - 1] = '\0';
    }
    else
    {
        local_buffer[bytes_read] = '\0';
    }

假设上面的换行符,这里是我写的一个小测试程序:

int main() {

    char *buffer = malloc(1);

    *buffer = '\0';

    for (int i = 0; i < 3; i++)
    {
        (void) read_buffer(0, &buffer);

        puts(buffer);
    }

    free(buffer);

    return 0;
}

<强> RESULT

> ./a.out
abcdefg
abcdefg
hijklmn
abcdefghijklmn
opqrstu
abcdefghijklmnopqrstu
>