If I need to use a piece of memory throughout the lifespan of my program, is it really necessary to free it right before program termination?
Não é obrigatório, mas pode ter benefícios (assim como algumas desvantagens).
Se o programa alocar memória uma vez durante seu tempo de execução e, caso contrário, nunca o liberaria até o término do processo, pode ser uma abordagem sensata não liberar a memória manualmente e confiar no sistema operacional. Em todos os sistemas operacionais modernos que conheço, isso é seguro, no final do processo toda a memória alocada é retornada com segurança ao sistema.
Em alguns casos, não limpar explicitamente a memória alocada pode até ser notavelmente mais rápido do que fazer a limpeza.
No entanto, liberando toda a memória no final da execução explicitamente,
- durante a depuração / teste, as ferramentas de detecção de vazamento de memos não mostram "falsos positivos"
- pode ser muito mais fácil mover o código que usa a memória juntamente com alocação e desalocação em um componente separado e usá-lo posteriormente em um contexto diferente, em que o tempo de uso da memória precisa ser controlado pelo usuário do componente
A vida útil dos programas pode mudar. Talvez seu programa seja um utilitário de linha de comando pequeno hoje, com uma vida útil típica de menos de 10 minutos, e aloca memória em partes de alguns kb a cada 10 segundos - portanto, não precisa liberar nenhuma memória alocada antes que o programa termine. Posteriormente, o programa é alterado e recebe um uso prolongado como parte de um processo do servidor com várias semanas de vida - portanto, não liberar memória não utilizada não é mais uma opção; caso contrário, seu programa começará a consumir toda a memória disponível no servidor ao longo do tempo . Isso significa que você terá que revisar o programa inteiro e adicionar o código de desalocação posteriormente. Se você tiver sorte, esta é uma tarefa fácil, se não, pode ser tão difícil que as chances são altas que você perca um lugar. E quando você estiver nessa situação, você desejará ter adicionado o código "gratuito" ao seu programa antecipadamente, no momento em que você adicionou o código "malloc".
Mais geralmente, escrever alocação e código de desalocação relacionado sempre em par conta como um "bom hábito" entre muitos programadores: fazendo isso sempre, você diminui a probabilidade de esquecer o código de desalocação em situações onde a memória deve ser libertado.