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.
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 usandomalloc
y posiblemente se redimensiona usandorealloc
, pero no parece haber una llamada correspondiente afree
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 afree
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.