RETORNO DE PONTEIROS(ENDEREÇOS) EM FUNÇÕES

1. RETORNO DE PONTEIROS(ENDEREÇOS) EM FUNÇÕES

José
DeuRuimDotCom

(usa Linux Mint)

Enviado em 28/12/2020 - 17:48h

Há perigo em declarar um ponteiro interno à função, atribuir-lhe memória (alocada dinamicamente ou por um vetor interno criado), processar dados e tal, e depois retornar seu conteúdo para atribuição a ponteiro externo?
Onde a função endereça a memória dinamicamente alocada? Em sua própria pilha de execução?


  


2. Re: RETORNO DE PONTEIROS(ENDEREÇOS) EM FUNÇÕES

leandro peçanha scardua
leandropscardua

(usa Ubuntu)

Enviado em 28/12/2020 - 21:39h

O perigo é ter memória alocada sem referência, ie, perdida para sempre. Isso pode acontecer se c cria uma variável ponteiro dentro de uma função, aloca memória e sai da função sem liberar a memória. Cada vez q vc chamar a função vai acumulando memória não usada, até dar um crash no programa ( ou tela azul se for no windows).
Linguagens sem ponteiro(java, python) evitam isso criando um coletor de lixo, q guarda as referências de toda memória criada e, de tempos em tempos, qdo percebe q algum bloco está sem referência, faz a liberação sem ajuda do programador.


3. Re: RETORNO DE PONTEIROS(ENDEREÇOS) EM FUNÇÕES

José
DeuRuimDotCom

(usa Linux Mint)

Enviado em 28/12/2020 - 23:04h

Olá Leandro, obrigado pela resposta.
Então, disso que falou estou ciente.
Talvez tenha me expressado mal, mas minha dúvida vai justamente no sentido contrário a sua resposta. Se terminada a execução da função e retornado o ponteiro, consigo preservar seguramente os dados processados pela rotina da função na região da memória a que aponta, sem preocupação, p ex., com desmonte de pilha.
Grande abraço!


4. Re: RETORNO DE PONTEIROS(ENDEREÇOS) EM FUNÇÕES

leandro peçanha scardua
leandropscardua

(usa Ubuntu)

Enviado em 29/12/2020 - 13:36h

DeuRuimDotCom escreveu:

Olá Leandro, obrigado pela resposta.
Então, disso que falou estou ciente.
Talvez tenha me expressado mal, mas minha dúvida vai justamente no sentido contrário a sua resposta. Se terminada a execução da função e retornado o ponteiro, consigo preservar seguramente os dados processados pela rotina da função na região da memória a que aponta, sem preocupação, p ex., com desmonte de pilha.
Grande abraço!

Sim, alocando dentro da função e retornando, o valor contido no endereço permanece e pode ser usado por todo o programa. Mas é bom manter a consistência na alocação de memória(onde é criada e onde é liberada) p evitar os problemas mencionados antes.