Olá, Vítor!
O sistema Operacional realmente faz o gerenciamento de memória, mas pense na seguinte situação:
Estamos desenvolvendo um sistema completo para uma grande empresa, e este sistema tem vários módulos, repletos de funções e rotinas internas. Ao utilizar uma funcionalidade desse sistema, alocamos uma grande quantidade de memória e não a liberamos ao fim da execução dessa função. Neste momento, nosso programa ainda retém o controle do gerenciamento de memória, impedindo que o Sistema Operacional interfira para liberar a memória que não está sendo mais usada, mas ainda está alocada.
Creio que a função free()
seja necessária principalmente nesses casos, onde na mesma execução do programa, corremos o risco de alocar grande quantidade de memória que pode fazer falta posteriormente, causando até mesmo a "quebra" daquele programa por falta de memória.
Então, por via das dúvidas, sempre utlize o free()
após alocar memória! Isso é praticamente uma regra ao se programar em C!
Espero ter ajudado!
Boa sorte em seus estudos!