C ++: Что должно быть возвращено, когда не хватает памяти?

Когда я кодирую, как показано ниже, он вернет ‘null’, и исключение не произошло.

Char* pStr = new(std::nothrow)Char(10);

Как насчет того, чтобы не использовать аргумент nothrow для оператора new?
Это также возвращает «ноль»? Если так, почему рекомендуется использовать аргумент nothrow?

Char* pStr = new Char(10);

Спасибо за ваше время.

0

Решение

new выдаст исключение, если оно не выполнится, если вы не укажете nothrowв этом случае он вернется nullptr если не получится.

Почему nothrow когда-либо используется: в некоторых системах исключения не поддерживаются (или плохо поддерживаются) (это может быть особенно актуально для игровых консолей). Так что лучше даже не использовать их вообще. Это всего лишь один пример, когда nothrow может быть использовано.

5

Другие решения

Как насчет не использовать 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 версия. Некоторые из таких ситуаций:

  • Вы работаете со старыми компиляторами C ++ (выпущенными до стандартизации языка), которые не поддерживают исключения.
  • Целевые платформы, где исключения явно отключены (например, встроенные системы) или не гарантируется правильная работа.
  • После 1990-х годов стандартное поведение new должен был вернуться NULL, если вы работаете с большим количеством устаревшего кода, который опирается на это поведение.
2

когда new не в состоянии выделить память, он выдает исключение bad_alloc что приведет к аварийному завершению работы вашей программы, если это исключение не обработано. Если мы хотим избежать этой ситуации, мы можем использовать nothrow который является аргументом для перегруженной функции new или может поймать исключение. nothrow вернусь null когда не хватает памяти и программист может решить, что делать в этот момент.

-1
По вопросам рекламы [email protected]