É o ato e várias técnicas de gerenciar a memória de trabalho de um computador, como dividir a memória física total disponível entre vários usuários de memória, como processos do sistema operacional, e garantir que eles não acessem ilegalmente a parte da memória um do outro. O escopo do termo pode diferir dependendo do contexto, mas as tarefas que se enquadram no gerenciamento de memória podem incluir, por exemplo, alocação de memória, encontrar e atribuir blocos de memória livre, e desalocação, liberar tais blocos, garantir a segurança da memória, organizar blocos de memória e otimizar o acesso à memória com caches ou reorganização de dados, virtualização de memória e tarefas relacionadas, como tradução de endereços ou tratamento de exceções de falta de memória. O gerenciamento de memória pode ser tratado em diferentes níveis: unidades de hardware, como MMU e caches de CPU, existem para executar certas tarefas críticas de tempo relacionadas à memória, como tradução de endereços, rapidamente, o sistema operacional pode ajudar com o gerenciamento, como implementar memória virtual e oferecer syscalls para alocação dinâmica e desalocação de memória, uma linguagem pode fazer algum gerenciamento automático de memória, como coleta de lixo ou tratamento de pilha de chamadas, e o próprio programador pode fazer seu próprio gerenciamento de memória, como decidir entre alocação estática e dinâmica ou escolher o tamanho do pedaço de alocação dinâmica.
Por que essa confusão? Como um programador novato que trabalha apenas com variáveis simples e linguagens de alto nível como Python que fazem tudo para você, você não precisa fazer muito gerenciamento de memória, mas ao trabalhar com dados cujo tamanho pode diferir muito e não é conhecido com antecedência, como arquivos, alguém tem que lidar com a possibilidade de os dados no disco não caberem na RAM atualmente alocada para seu programa ou, se os dados couberem, pode não haver um pedaço contínuo de memória grande o suficiente para eles. Se não sabemos quanta memória um processo precisará, quanta memória damos a ele, muito pouca e pode não ser o suficiente, muita e não haverá memória suficiente para os outros? Alguém tem que evitar vazamentos de memória para que seu computador não fique sem memória devido a bugs em programas. Com muitos processos sendo executados simultaneamente em um computador, alguém precisa controlar qual processo usa qual parte da memória e garantir que colisões, um processo sobrescrevendo a memória de outro processo, não aconteçam, e alguém precisa garantir que, se coisas ruins acontecerem, como um processo tentando gravar em uma memória que não o pertence, não haja consequências catastróficas.
Você precisa fazer muito gerenciamento de memória manual e há um grande perigo de estragar tudo, especialmente com alocação dinâmica, C não vai segurar sua mão, mas como recompensa seu programa será rápido e eficiente, não há segurança de memória uber. Não há coleta de lixo automática, se você alocar memória dinamicamente, você precisa manter o controle dela e liberá-la manualmente quando terminar de usá-la, ou você acabará com vazamento de memória.