paulo1205
(usa Ubuntu)
Enviado em 22/01/2023 - 21:51h
Segue extrato da
manpage da função
scandir().
DESCRIPTION
The scandir() function scans the directory dirp, calling filter() on
each directory entry. Entries for which filter() returns nonzero are
stored in strings allocated via malloc(3), sorted using qsort(3) with
the comparison function compar(), and collected in array namelist
which is allocated via malloc(3). If filter is NULL, all entries are
selected.
Como você pode ver nos trechos grifados, a função usa
malloc() internamente, e entrega a você ponteiros para os dados por ela alocados, a fim de que você os manipule com segurança enquanto deles precisar. Assim, cabe também a você devolver essa memória quando não precisar mais dela.
Não sei se você está se apegando a um comentário que eu fiz numa postagem passada sua, no qual eu disse que você só deveria aplicar
free() a dados apontados por algo alocado por
malloc(),
calloc() e
realloc(). De fato, ou originalmente disse isso, mas a minha intenção era diferenciar ponteiros que apontam para regiões de memória alocadas por essas funções de ponteiros que são obtidos de outras formas (por exemplo: quando você atribui a um ponteiro o endereço do primeiro elemento de um
array declarado como tal, ou quando a alocação é feita por meio de um mecanismo de alocação incompatível, tal como a função não-padronizada
alloca() ou os operadores de alocação
new e
new [] do C++).
Contudo, numa outra mensagem do mesmo
thread, eu mesmo esclareci que existem outros casos válidos — necessários, até — de uso de
free(), incluindo funções da biblioteca padrão do C ou do POSIX (ou mesmo da glibc) que fazem alocação de memória de maneira compatível com
free(), tais como
asprintf() (versão de
sprintf() que faz alocação de memória suficiente para conter toda a saída), a função
getline(), qualquer uma das conversões de
strings da família de
scanf() com o modificador
m, e várias outras. Quando isso acontece, a documentação costuma deixar muito claro que tipo de alocação é feita, e informa você da necessidade de liberar a memória que a função porventura tenha alocado.
Aprender por exemplos é bom e importante, mas é sempre bom ler a documentação daquilo que você usa.
... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)