Аллокатор умеет выделять и освобождать память в требуемых количествах определённым образом. std::allocator -- пример реализации аллокатора из стандартной библиотеки, просто использует new и delete, которые обычно обращаются к системным вызовам malloc и free.
Более сложный пример -- pool allocator. Раз системные вызовы дороги, почему бы на них не сэкономить? Выделим сразу 1 гигабайт памяти (к примеру), а дальше в аллокаторе будем выдавать память из этого пула и увеличивать указатель head (опять же, упрощенно). Реальное выделение памяти только одно, системных вызовов почти нет, ура-ура, программа ускорилась.
Собственно, для этого и нужны аллокаторы, чтобы вставлять свое, крутое, нестандартное, выделение памяти в любое место. Большинство стандартных контейнеров их принимают.