[RESOLVIDO] Retorno de ponteiro e boas práticas em C

Olá meus caros!

Vou exemplificar com alguns códigos genéricos a minha dúvida sobre o retorno de ponteiro na linguagem C.

Considerem a função:

int* funcao_1(){
  
  int* prt = (int*) malloc(sizeof(int));
  return ptr;  
}

Considere que esse ponteiro será retornado para uma variável dentro de outra função.

int* funcao_2(){
    int* prt = funcao_1(); // Invoca a 1º função
    // faz alguma coisa
   // valida os dados, etc..
    return prt;
}

Considere que este ciclo se repita para mais funções e/ou procedimentos, etc. E que em algum momento, o dado guardado não será mais necessário para a aplicação e poderemos liberá-lo, usualmente como:

free(ptr);
prt = NULL;

Na função principal do C, a Main() - eu utilizo o mínimo de rotinas possíveis e deixo que algumas funções básicas realizem o processamento do algoritmo e retornem por ponteiro algum espaço de memória que poderá conter dados lidos via teclado, texto, etc. A questão é que não vejo como boa prática poluir a função Main(). Prefiro modularizar o código e criar uma rotina maior que os engloba, a fim de dar coesão para os procedimentos e funções.

Considerando o retorno das funções acima, é uma boa prática alocar em uma dada função, um espaço de memória no Heap - usando malloc(), e retornar aquele ponteiro para outras funções a fim de por exemplo reduzir o uso de variáveis globais ou mesmo a declaração de novas variáveis locais? (Considerando que a liberação do espaço é feito por outra função.) Na questão de boas práticas, o que seria uma boa alternativa considerando a performance e manutenção do código?

Grato!

Existem vantagens de vc não acoplar o seu codigo a alocação de memória. Se vc esta desenhando uma API, vc receber um ponteiro ja alocado (seja como for) ajuda a deixar claro q quem aloca é quem desaloca - por exemplo. E vc pode ter un controle fino em termos de performance (pode criar um pool de objetos e reusa-los e assim minimizar a alocação de memoria, etc).

Exceto se vc precisa criar uma coisa para o usuario. Tipo manipular uma lista ligada: pode ser mais facil q a biblioteca crie via malloc - mas ai é um padrão criacional.

O chato é ter q documentar que a biblioteca é ou não thread-safe, se ela aloca, qual o ciclo de vida das coisas… se vc tem uma assinatura onde recebe um ponteiro então é mais evidente - e acho isso mais importante

1 curtida