Возможно, вы смотрите на это неправильно. Я не думаю, что есть какой-либо способ ограничить выделение памяти всем приложением (так как большая часть выделения памяти может находиться за пределами вашего кода), поэтому лучший способ сделать это - контролировать то, что вы можете - т.е. реализацию обработчика.
Настройте обработчик для вызова экземпляра класса «OutOfMemoryHandler» (назовите его как хотите) в начале программы и используйте его поведение по умолчанию для вызова существующего обработчика. Если вы хотите добавить специфичную для класса обработку, добавьте поведение в свой OutOfMemoryHandler, используя ваши любимые методы C ++ для динамического поведения.
Это решение должно хорошо работать в однопоточной среде, но не будет работать в многопоточной среде. Чтобы он работал в многопоточной среде, необходимо, чтобы вызывающая сторона уведомила объект-обработчик о том, что он работает в определенном потоке; Передача идентификатора потока с классом была бы хорошим способом сделать это. Если вызывается обработчик, он проверяет идентификатор потока и определяет поведение, которое нужно выполнить, основываясь на связанном классе. Когда вызов new () завершен, просто отмените регистрацию идентификатора потока, чтобы обеспечить правильное поведение по умолчанию (так же, как вы уже делаете при сбросе обработчика по умолчанию).