A função da biblioteca C free() pode, mas não precisa, retornar a memória ao kernel.
Algumas implementações de malloc() movem o limite entre o "heap" eo espaço de endereço não utilizado (a "quebra do sistema") por meio da chamada do sistema sbrk() , distribuindo pedaços menores dessas grandes alocações. Sem obter todas as partes menores desalocadas, free() não pode realmente retornar a memória para o SO.
O mesmo motivo se aplica a malloc() implementações que não usam sbrk(2) , mas talvez use mmap("/dev/zero") ou algo assim. Não consigo encontrar uma referência, mas parece que me lembro de uma ou outra das O BSD usou mmap() para obter páginas de memória. No entanto, free() não pode retornar uma página ao sistema operacional, a menos que cada subalocação seja desalocada pelo programa.
Algumas implementações malloc() retornam memória ao sistema: ChorusOS (?) aparentemente fez. Não está claro se mudou a quebra do sistema ou munmap()'ed páginas.
Aqui está um artigo sobre um alocador de memória que melhora o desempenho "agressivamente desistir de páginas livres para o gerenciador de memória virtual ". Apresentação de slides para uma palestra sobre o alocador.