1st: (отвечая на реальный вопрос): поскольку он использует динамически распределенную память, да, он может выдавать std::bad_alloc
(я никогда не видел исключений для буст-перевода std::bad_alloc
; было бы сумасшествием сделай так).
2nd: (прокомментируйте ваше разъяснение): вам необходима информация о доступной физической памяти, чтобы оптимизировать производительность вашего алгоритма во время выполнения. Тем не менее, вы не можете полагаться на std::bad_alloc
, чтобы определить, сколько памяти у вас есть, поскольку современные операционные системы используют такую вещь, как overcommit , что означает: они (почти) никогда не возвращают неудачную попытку выделения, но вместо этого просто дайте вам некоторую «память», которая не сможет появиться, когда вы действительно попытаетесь получить к ней доступ.
В Java это может работать, так как виртуальная машина делает для вас много вещей: она пытается выделить несколько непрерывных кусков памяти и делает это в отношении доступной физической памяти и доступной неиспользованной физической памяти решить, стоит ли ему больше подчеркивать ГК или просто выделить больший мусор. Кроме того, по соображениям производительности необходимо учитывать, что виртуальная память и физическая память - это совершенно разные понятия.
Если вам нужно для оптимизации производительности ваших алгоритмов для таких случаев (что вполне может потребоваться в зависимости от вашей области работы), вам необходимо проверить функции, специфичные для вашей платформы, которые могут сказать вам, как "реальный мир" выглядит так.