Когда я кодирую, как показано ниже, он вернет ‘null’, и исключение не произошло.
Char* pStr = new(std::nothrow)Char(10);
Как насчет того, чтобы не использовать аргумент nothrow для оператора new?
Это также возвращает «ноль»? Если так, почему рекомендуется использовать аргумент nothrow?
Char* pStr = new Char(10);
Спасибо за ваше время.
new
выдаст исключение, если оно не выполнится, если вы не укажете nothrow
в этом случае он вернется nullptr
если не получится.
Почему nothrow
когда-либо используется: в некоторых системах исключения не поддерживаются (или плохо поддерживаются) (это может быть особенно актуально для игровых консолей). Так что лучше даже не использовать их вообще. Это всего лишь один пример, когда nothrow
может быть использовано.
Как насчет не использовать
nothrow
спор оnew
оператор? Это также возвращаетnull
?
Стандарт C ++ (§18.4.1.1) определяет новый оператор как:
void* operator new (std::size_t size) throw (std::bad_alloc);
Таким образом, стандартное поведение new, которое принимает один аргумент, это бросить std::bad_alloc
в случае неудачи.
Стандарт также определяет nothrow
новая версия, которая принимает два параметра:
void* operator new(std::size_t size, const std::nothrow_t&) throw();
Эта версия возвращает NULL
в случае неудачи, но учтите, что для использования этой версии вам явно необходимо передать дополнительный параметр новому оператору.
Когда вы должны использовать
nothrow
версия?
В идеале, вы всегда должны использовать стандартную версию нового, который бросает bad_alloc
. Вы должны всегда придерживаться этой рекомендации. Однако в некоторых ситуациях вы можете быть вынуждены использовать nothrow
версия. Некоторые из таких ситуаций:
new
должен был вернуться NULL
, если вы работаете с большим количеством устаревшего кода, который опирается на это поведение.когда new
не в состоянии выделить память, он выдает исключение bad_alloc
что приведет к аварийному завершению работы вашей программы, если это исключение не обработано. Если мы хотим избежать этой ситуации, мы можем использовать nothrow
который является аргументом для перегруженной функции new
или может поймать исключение. nothrow
вернусь null
когда не хватает памяти и программист может решить, что делать в этот момент.