O erro geralmente cometido é escrever seus próprios alocadores, para que você possa ter mais controle sobre quanta memória é usada por cada sistema e ter mais visibilidade do que está acontecendo. Uma maneira muito melhor de conseguir isso é usar um perfilador de memória. Existem muitos perfis de memória por aí, o meu MemPro é um exemplo. Essa é uma maneira totalmente não invasiva de controlar todo o uso de memória, e você pode dividi-la automaticamente em subsistemas usando filtros curinga de pilha de chamada. Idealmente, é melhor manter sua alocação de memória e rastreamento de memória totalmente separados, pois eles têm requisitos totalmente diferentes.
Dividir arbitrariamente sua memória em pools geralmente pode ser prejudicial, pois cada pool terá uma sobrecarga. Você pode acabar usando muito mais memória do que precisa sem realmente perceber. Para reduzir o desperdício, é sempre melhor agrupar tudo, a folga é então compartilhada por todo o sistema.
Os únicos motivos para usar alocadores personalizados são o desempenho da CPU (principalmente para a coerência do cache) e para limitar a fragmentação. Um exemplo perfeito disso é um sistema de partículas. Você deseja que todas as partículas sejam contíguas na memória e não deseja incluir na memória principal muitas alocações de curta duração. Outro bom exemplo de particionamento é uma linguagem de script.
Se você deseja um exemplo de substituição de malloc de uso geral, pode dar uma olhada no meu alocador VMem . Ele foi usado em vários jogos AAA enviados. Possui técnicas que limitam a fragmentação e mantêm a área de memória baixa, algo crítico para jogos de console. Também é muito rápido sob alta contenção de threads. Meu site possui uma extensa documentação sobre essas técnicas.