Ainda dúvidas com ponteiros e o free! [RESOLVIDO]

1. Ainda dúvidas com ponteiros e o free! [RESOLVIDO]

Apprentice X
ApprenticeX

(usa FreeBSD)

Enviado em 20/01/2023 - 15:39h

Boa Tarde a todos

Já fiz perguntas similares a essa, mas estou tentando criar um padrão pra entender quando devo ou não usar free
A princípio entendi que só devo usar free quando usar malloc. Ok.
Entendi que tudo é liberado qdo o programa termina! Ok.

Hoje me deparei com um algoritmo que usou o comando free! E estou considerando o comando desnecessário!
Quero entender se estou certo em relação a isso!
Link do Algoritmo que estou analisando: https://man7.org/linux/man-pages/man3/scandir.3.html

Abaixo exemplo simplificado do link para essa questão!
#include <stdio.h>
#include <dirent.h>

int main(void) {
struct dirent **namelist;
int n = scandir(".", &namelist, 0, alphasort);

while(n--) {
printf("%s\n", namelist[n]->d_name);
//free(namelist[n]); // Posso dispensar isso, neste local certo?
}
//free(namelist); // Posso dispensar isso, neste local certo?
}



  


2. MELHOR RESPOSTA

Paulo
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)

3. Re: Ainda dúvidas com ponteiros e o free! [RESOLVIDO]

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 20/01/2023 - 15:39h

Sim, você pode dispensar os comandos [b]free[\b] nos locais indicados. A função scandir(), usada no algoritmo, é responsável por alocar memória dinamicamente para o array de estruturas de diretório (struct dirent **namelist). Ao fim da execução, a função temresponsabilidade de liberar esta memória, e não é necessário executar o free() manualmente nenhuma vez.


4. Re: Ainda dúvidas com ponteiros e o free! [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 20/01/2023 - 16:59h

Esse bot bolado aí tá putamente errada!
Sempre que alocar alguma coisa com malloc ou mesmo calloc, sempre é necessário liberar a memória quando não for mais usar tal variável. E alguns debuggers até faxem o programador setar para NULL o ponteiro depois de liberado. E no caso da leitura de diretório é obrigatório liberar a memória da struct daquele jeito que está comentado.

Em C não existe garbage collectir e por tanto fica a critério do programador liberar a memória de forma manual, inclusive aquelas memórias alocadas internamente por chamadas de funções. Que no caso desse último a documentação da função deve avisar que ela aloca alguma memória pro programador liberar depois, se não teremos lmemory leaks a cada nova chamada da função em questão.


https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


5. Re: Ainda dúvidas com ponteiros e o free! [RESOLVIDO]

Apprentice X
ApprenticeX

(usa FreeBSD)

Enviado em 20/01/2023 - 18:15h

SamL escreveu:

Esse bot bolado aí tá putamente errada!
Sempre que alocar alguma coisa com malloc ou mesmo calloc, sempre é necessário liberar a memória quando não for mais usar tal variável. E alguns debuggers até faxem o programador setar para NULL o ponteiro depois de liberado. E no caso da leitura de diretório é obrigatório liberar a memória da struct daquele jeito que está comentado.

Em C não existe garbage collectir e por tanto fica a critério do programador liberar a memória de forma manual, inclusive aquelas memórias alocadas internamente por chamadas de funções. Que no caso desse último a documentação da função deve avisar que ela aloca alguma memória pro programador liberar depois, se não teremos lmemory leaks a cada nova chamada da função em questão.


https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


Boa tarde SamL, obrigado por responder!

Como eu informo na pergunta, USANDO malloc, eu sei que tem que usar o free!
Quero saber no Código postado que não mostra em nenhum lugar o uso do malloc! Se é ou não necessário o free conforme no link usam e que dispensei no source acima!
Obrigado!


6. Re: Ainda dúvidas com ponteiros e o free! [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 20/01/2023 - 18:44h

Eu não costumo usar essas funções, mas como o exemplo está na documentação oficial é de se supor que tenha de usar free sim, exatamente como no exemplo. E realmente falta dizer isso de forma explícita na doc mas parece que esqueceram de avisar nela e ai acharam o exemplo suficiente.


https://nerdki.blogspot.com/ acessa ai, é grátis
Não gostou? O ícone da casinha é serventia do site!


7. Re: Ainda dúvidas com ponteiros e o free! [RESOLVIDO]

Apprentice X
ApprenticeX

(usa FreeBSD)

Enviado em 23/01/2023 - 00:35h

paulo1205 escreveu:
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++).

Sim, acho que fiz confusão, mas agora entendi melhor! Passarei a verificar nas funções também! Obrigado






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts