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

Когда следует использовать std:: nothrow?

Каково идеальное использование std::nothrow?

4b9b3361

Ответ 1

Я бы использовал его только как оптимизацию (или упрощение кода), когда в противном случае я бы сразу поставил блок try-catch вокруг использования обычного нового, catching std::bad_alloc.

Это довольно редкая ситуация, потому что редко можно было с пользой обращаться с памятью прямо на сайте вызова. Обычно вы выделяете память, потому что вам это нужно, а не потому, что вам очень нравится иметь ее, но она может жить без нее. Код, который пропускает нулевые указатели, поддерживает цепочку вызывающих абонентов, пока в конце концов кто-то не справится с проблемой, не является идиоматическим С++.

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

Обратите внимание, что выражение, включающее std:: nothrow, все равно может генерировать исключение (в частности, из любого конструктора выделенного объекта), поэтому нужно только одно, если вы надеетесь избежать выброса исключения. Вы также должны убедиться, что конструктор не будет бросать.

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

Ответ 2

Как я понимаю, почти никогда и никого нет.

Ответ 3

Портирование C-программы на С++. В вашей программе C есть все эти проверки, после каждого malloc и без понятия исключений. Поэтому гораздо проще изменить каждый malloc на новый (nothrow), чем обернуть каждый malloc в блок try.

Ответ 4

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

Имейте в виду, что Страуструп довольно категоричен, что программист может отключить накладные расходы на С++. (Как предостережение, хотя, только потому, что у вас есть выбор, это не значит, что вы должны.)

Ответ 5

Вы используете std:: nothrow, когда хотите проверить значение null после каждого нового. Многого устаревшего кода необходимо было, когда была сделана первая версия стандарта. Много устаревшего кода, написанного впоследствии, тоже использует его, потому что люди, параноидальные из-за исключений. Иногда вы столкнетесь с кем-то, кто все еще есть.

Так очень редко, что вы на самом деле захотите сделать это, что мне даже понадобилось секунду, чтобы вспомнить WTF, о котором вы говорили.

Ответ 6

Я знаю, что были более старые версии С++ (в частности, Microsoft), которые не бросали, когда они не могли выделить память, но вместо этого вернули NULL. Это был бы простой способ поддерживать совместимость со старым кодом, а не изменять всю логику.

Ответ 7

http://www.cplusplus.com/reference/std/new/nothrow/

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

Тем не менее, я обычно предпочитаю общий вариант.

Ответ 8

Я могу себе представить, что это можно использовать как оптимизацию с быстрым путём с пользовательскими распределителями - скажем, сбой текущего запроса и увеличение пула в какой-то более поздний/простой. В значительной степени угловой случай.

Ответ 9

Только очень немногие программы должны выделять более 1 гигабайта памяти, а поскольку современные системы перекомпилируют память, new никогда не вернет null или не выбросит эти системы. Поэтому абсолютно нет смысла проверять возвращаемое значение new/malloc вообще. Просто держите свою память ниже и позволяйте убийце из-за-памяти уничтожить другие процессы!