Подтвердить что ты не робот

Следует ли всегда проверять, работал ли новый оператор?

У меня есть два вопроса о новом операторе:

  • Может ли новый оператор не выделять память?

  • Должен ли один тест после каждого использования нового, если действительно был создан объект?

4b9b3361

Ответ 1

оператор new выдает исключение std:: bad_alloc при ошибке, если вы явно не используете версию nothrow. Поэтому не проверяйте возвращаемое значение: если вы придете к следующей строке после вызова конструктора, вы можете с уверенностью предположить, что конструктор сработал.

Но заверните соответствующую ветку вашего кода в блок try-catch: обычно не прямо прямо вокруг нового вызова, а где-то вверх по линии, где вы можете отменить все, что зависит от выделения, и ничего больше,

ОБНОВЛЕНИЕ: Но см. также комментарий Джонатана Леффлера ниже о нехорошем варианте нового.

Ответ 2

  • Да, new может не выделять память, но по умолчанию она генерирует исключение, если оно не работает.
  • Вам нужно только проверить результат, если вы используете вариант без броска new.

Ответ 3

Нет необходимости проверять значение null в целом. Ошибка распределения приведет к исключению std:: bad_alloc, с которым вы можете иметь дело, если хотите.

Стандарт указывает:

"Если функция распределения, объявленная с не-бросающей спецификацией исключений (15.4), не может выделить хранилище, она должна возвращать нулевой указатель. Любая другая функция распределения, которая не может выделить хранилище, должна указывать на сбой только путем исключения исключения из тип, который будет соответствовать обработчику (15.3) типа std:: bad_alloc (18.6.2.1)."

YMMV в зависимости от того, насколько реально соответствует ваш компилятор. Я думаю, что большинство современных компиляторов С++ должны смущаться, чтобы сделать это по-другому.:)

Ответ 4

Я не думаю, что вы должны каждый раз проверять, чтобы новый объект был создан, обычно новый оператор не терпит неудачу при создании объекта, если у вас нет некоторых проблем с кодированием.

Единственное, что вам всегда нужно учитывать, - это создать рабочий конструктор, который правильно настроил новый объект.

Ответ 5

  • Да. Если это происходит на современной ОС с виртуальной памятью, это обычно из-за ошибки в приложении (например, выделения безумного объема памяти) или очень плохой проблемы с фрагментацией.

  • Если new завершается сбой, он выдает исключение std::bad_alloc. Это зависит от вашего приложения, чтобы решить, хочет ли он поймать это исключение и попробовать что-то еще. Это зависит от типа приложения.

Однако некоторые люди используют нестандартную версию new, которая возвращает нулевой указатель вместо того, чтобы бросать исключение. Для этого вы бы использовали те же критерии, что и для старомодных malloc. Это зависит от типа распределения. Часто сбой - это правильная вещь, если вы не можете выполнить выделение, поэтому проверка NULL может быть приемлемым решением.