Есть какой-нибудь аллокатор, который не позволяет брать из него памяти больше, чем укажешь? И ещё чтобы печатал ошибку в случае невозможности аллокации
Можешь пожалуйста подробнее объяснить, что тебе надо?
Ошибку в случае невозможности аллокации печатает тот, кто попытался ее сделать. Для этого в std есть функция handle_alloc_error (которая как раз-таки печатает сообщение о ошибке выделения и аварийно останавливает программу).
Контракт аллокатора таков, что если ты запросил N байт, то тебе дали только N байт, пытаться обращаться к каким-то другим это UB. Но реализация аллокатора не в силах проверять соблюдение этого контракта. Вместо этого, насколько я помню, есть поддержка AddressSanitizer, который ловит баги при работе с памятью.