std :: abort и std :: exit (и другие: std :: _ Exit, std :: quick_exit) - это просто функции нижнего уровня. Вы используете их, чтобы сообщить программе, что именно вы хотите, чтобы она делала: какие деструкторы (и если) вызывать, какие еще функции очистки вызывать, какое значение возвращать и т. Д.
std :: terminate - это абстракция более высокого уровня: она вызывается (либо во время выполнения, либо вами), чтобы указать, что в программе произошла ошибка и что по какой-то причине ее невозможно обработать, выбрасывая исключение. Необходимость в этом обычно возникает, когда ошибка возникает в самом механизме исключения, но вы можете использовать ее в любое время, когда вы не хотите, чтобы ваша программа продолжалась после указанной ошибки. В своем посте я составил полный список ситуаций, когда вызывается std :: terminate. Не указано, что делает std :: terminate, потому что вы контролируете это. Вы можете настроить поведение, зарегистрировав любые функции. Ограничения, которые у вас есть, заключаются в том, что функция не может вернуться на сайт ошибки и не может выйти через исключение, но технически вы даже можете запустить свой насос сообщений внутри. Список полезных вещей, которые можно делать внутри, см. В другом моем посте .
В частности, обратите внимание, что std :: terminate считается обработчиком исключений в контекстах, где std :: terminate вызывается из-за сгенерированного исключения, которое не может быть обработано, и вы можете проверить, что это за исключение, и проверить его с помощью C ++ 11 с использованием std :: rethrow_exception и std :: current_exception. Все это в моем посте .