Почему новая версия std :: nothrow широко не используется

Согласно C++ ссылке, вы можете создать новый объект:

MyClass * p1 = new MyClass;

или

MyClass * p2 = new (std::nothrow) MyClass;

Второй возвращает пустой указатель вместо того, чтобы бросать исключение.

Тем не менее, я почти не вижу эту версию в своем опыте.

Например, Google не рекомендует использовать исключение в своем коде, но они не используют версию nothrow ни в Chromium, как я вижу.

Есть ли какая-то причина, по которой мы предпочитаем дефолт по отношению к нечетному? Даже в проекте, который не использует исключение?

-- РЕДАКТИРОВАТЬ --

Следующий вопрос: следует ли проверять возвращаемое значение malloc()?

Похоже, напротив, многие люди советуют проверять возвращаемое значение malloc, некоторые говорят, потому что:

многие неудачи распределения не имеют ничего общего с отсутствием памяти. Фрагментация может привести к сбою распределения, потому что недостаточно свободного пространства, хотя у него много свободного места.

Это правда? Почему мы рассматриваем malloc() и new() разному в этом случае?

Ответ 1

Тем не менее, я почти не вижу эту версию в своем опыте.

Вы бы использовали его (или, что то же самое, поймать исключение из версии по умолчанию), если вы можете обрабатывать ошибку локально; возможно, попросив освободить другую память, а затем повторить попытку или попытаться выделить что-то меньшее или использовать альтернативный алгоритм, который не требует дополнительной памяти.

Есть ли какая-то причина, по которой мы предпочитаем дефолт по отношению к нечетному?

Общий принцип исключений: если вы не можете обрабатывать его локально, тогда нет места для проверки локально. В отличие от возвращаемых значений исключения нельзя игнорировать, поэтому нет возможности вспашки независимо и с использованием нулевого указателя.

Даже в проекте, который не использует исключение?

Зачастую состояние с отсутствием памяти не может быть обработано вообще. В этом случае прекращение программы, вероятно, является лучшим ответом; и это ответ по умолчанию на необработанное исключение. Таким образом, даже если вы не используете исключения, то по умолчанию new, вероятно, лучший вариант в большинстве ситуаций.

следует проверить возвращаемое значение malloc()?

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

Почему мы рассматриваем malloc() и new разному в этом случае?

Поскольку malloc заставляет нас проверять возвращаемое значение, в то время как new дает нам возможность менее интрузивной обработки ошибок.

Ответ 2

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

Если вы используете версию nothrow вы можете nothrow распространение нулевого указателя через ваше приложение и сбой/выход из MUCH позже в точке, которая, по-видимому, полностью не связана с распределением памяти, что делает отладку намного сложнее.