es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Fuga de memoria / liberación incorrecta. ¿Cómo solucionarlo?

Estoy leyendo parcialmente la entrada en un búfer en una función y luego liberándola en main(), pero parece que no funciona. Mi código:

char *save_to_buff()
{
    int fd = 0; // se establece read() para leer desde STDIN_FILENO, porque su número es 0
    const size_t read_size = 100; // se establece el tamaño del fragmento
    size_t size = read_size;
    char *buff = malloc(size+1);
    size_t offset = 0;
    size_t res = 0;
    while((res = read(fd, buff + offset, read_size)) > 0) // lectura parcial desde stdin y guardado en buff
    {
        if(res == -1) // verificar errores de lectura
        {
            read_error();
            free(buff);
            return NULL;
        }

        offset += res;
        if (offset + read_size > size)
        {
            size *= 2;
            buff = realloc(buff, size+1);
        }
        buff[offset] = '\0';
    }
    return buff;
}

main:

char *buff = save_to_buff();
// hacer algo
free(buff);

Edit: acabo de probarlo con una lectura de 1 byte y no una lectura parcial y no hay fugas de memoria.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que hay una fuga de memoria en el código proporcionado, como se muestra en el resultado de Valgrind. Específicamente, la variable buff se asigna usando malloc y posiblemente se redimensiona usando realloc, pero no parece haber una llamada correspondiente a free para liberar la memoria asignada.

    Una posible razón de esta fuga es que la función save_to_buff devuelve un puntero a la memoria asignada, pero no transfiere la propiedad de esa memoria al llamador. Como resultado, cuando el llamador (en este caso, main) llama a free en el puntero, solo libera el último bloque de memoria que se asignó, pero no los bloques intermedios.

    Para solucionar esto, una opción podría ser modificar save_to_buff para que tome un parámetro adicional en el que se puedan almacenar los búferes, en lugar de devolver un puntero directamente. Esto le daría al llamador más control sobre la vida útil de la memoria y aseguraría que se libere correctamente toda la memoria asignada cuando ya no sea necesaria.

Comments are closed.