Я бы использовал его только как оптимизацию (или упрощение кода), когда в противном случае я бы немедленно поместил блок try-catch вокруг использования обычного нового, перехватывая std::bad_alloc
.
Это довольно редкая ситуация, потому что редко можно эффективно использовать нехватку памяти прямо на месте вызова.Обычно вы выделяете память, потому что она вам нужна, а не потому, что вы хотели бы иметь ее, но можете жить без нее.Код, который передает нулевые указатели, создает резервную копию цепочки вызывающих, пока в конечном итоге кто-то не сможет решить проблему, не является идиоматическим C ++.
Может случиться так, что ошибка действительно может быть немедленно обработана.Например, вы можете оказаться в ситуации, когда вы будете использовать один алгоритм или метод с достаточным рабочим пространством, а другой, более медленный алгоритм или метод без него.Опять же, вы бы выделяли такое рабочее пространство непосредственно с new
?Не нормально.И в любом случае вам иногда нужно быть осторожным с этим подходом, потому что если ваша ОС перегружена, то в целом вы не можете изящно обработать нехватку памяти на уровне приложения.
Обратите внимание, что выражение, включающееstd :: nothrow может по-прежнему генерировать исключение (в частности, из любого конструктора объекта, который выделяется), поэтому требуется только одна вещь, если вы хотите избежать исключения.Вы также должны убедиться, что конструктор не выбросит.
Насколько мне известно, дни программ на C ++, которые вообще не используют исключения, прошли.Я полагаю, что если они возобновятся для меня из-за какого-то особого руководства по стилю, то это еще одна вероятная причина, по которой не требуется ничего нового.