С
иметь дело с исключениями тяжелее
по сравнению с простым if (t), почему не
нормальный новый T () не считается меньше
хорошая практика, учитывая, что мы будем
должен использовать try-catch (), чтобы проверить, если
простое распределение прошло успешно (и если мы
не, просто смотри как программа умирает)
Каковы преимущества (если таковые имеются)
нормальное новое распределение по сравнению с
используя новую? Исключение-х
накладные расходы в этом случае незначительны
Штраф за использование исключений действительно очень большой, но (в прилично настроенной реализации) штраф оплачивается только , когда выдается исключение - поэтому основной случай остается очень быстрым, и маловероятно, что быть любой измеримой производительностью между двумя в вашем примере.
Преимущество исключений состоит в том, что ваш код проще: если вы выделяете несколько объектов, вам не нужно делать «распределить A; if (A) {выделить B; if (B) и т. Д.»). Очистка и завершение - как в случае исключения, так и в случае основной линии - лучше всего обрабатывать автоматически с помощью RAII (в то время как при проверке вручную вам также придется освободить вручную, что слишком упрощает утечку памяти).
Кроме того, предположим, что распределение не выполнено
(например, в системе нет памяти).
Есть ли что-нибудь, что может сделать программа
в такой ситуации или просто не получится
изящно. Там нет способа найти
свободной памяти в куче, когда все будет
зарезервировано, есть?
Есть много вещей, которые он может сделать, и лучшее, что можно сделать, будет зависеть от написанной программы. Сбой и выход (изящно или иначе), безусловно, один из вариантов. Другой способ - заранее зарезервировать достаточное количество памяти, чтобы программа могла выполнять свои функции (возможно, с ограниченной функциональностью или производительностью). Он может быть в состоянии освободить часть своей собственной памяти (например, если он поддерживает кэши, которые могут быть восстановлены при необходимости). Или (в случае серверного процесса) сервер может отказаться обрабатывать текущий запрос (или отказать в принятии новых подключений), но продолжать работать, чтобы клиенты не теряли свои подключения, и все могло начать работать снова, когда память возвращается. Или в случае интерактивного приложения / приложения с графическим интерфейсом пользователь может отображать ошибку и продолжать работу (что позволяет ему исправить проблему с памятью и повторить попытку - или хотя бы сохранить свою работу!).
, если выделение не удастся, и
std :: bad_alloc брошен, как мы можем
Предположим, что так как недостаточно
память для выделения объекта (например,
новый int), памяти будет достаточно
хранить исключение ??
Нет, обычно стандартные библиотеки гарантируют, обычно путем предварительного выделения небольшого объема памяти, что будет достаточно памяти для исключения в случае ее исчерпания.