Я студент, и у меня есть небольшие знания на C++, которые я пытаюсь расширить. Это скорее философский вопрос. Я не пытаюсь что-то реализовать.nothrow или исключение?
С
#include <new>
//...
T * t = new (std::nothrow) T();
if(t)
{
//...
}
//...
скроет Exception, и с тех пор дело с исключениями тяжелее по сравнению с простой if(t)
, почему не нормальный new T()
не считается менее хорошей практикой, учитывая, что мы должны использовать try-catch()
чтобы проверить, удалось ли простое распределение (и если мы этого не сделаем, просто просмотрите программу)?
Каковы преимущества (если есть) нормального new
распределения по сравнению с использованием nothrow new
? Накладные расходы исключений в этом случае несущественны?
Кроме того, предположим, что сбой распределения (например, в системе нет памяти). Есть ли что-нибудь, что программа может сделать в этой ситуации, или просто изящно терпеть неудачу. Нет способа найти свободную память в куче, когда все зарезервировано, есть ли?
Incase выделение терпит неудачу, и std::bad_alloc
является throw
п, как мы можем предположить, что, так как не хватает памяти для размещения объекта (например. new int
), будет достаточно памяти для хранения исключение ??
Спасибо за ваше время. Надеюсь, этот вопрос соответствует правилам.
Если новый код не работает в вашем коде выше. Что вы планируете делать в заявлении if? На этом этапе невозможно исправить ошибку. –
@ Мартин, ничего действительно. Мне было просто интересно узнать об этом случае, и если есть преимущество в использовании 'nothrow'. На самом деле ответы сделали многие вещи ясными. – Muggen
Вы выбрали неудачный пример распределения памяти. Приложения, работающие на современных настольных ОС, обычно не генерируют исключение или возвращают сообщение об ошибке, когда у них заканчивается память.Вместо этого вся система просто замерзает, в то время как ОС борется с проигранным сражением «имитации» запрошенной памяти с использованием более медленного хранилища. Но вопрос об исключениях против кодов возврата хорош, если применяется к файловым ввода-выводам, сетевому доступу, синтаксическому анализу строк или любому числу других задач. –