new
используется для создания объектов, а не для выделения памяти, поэтому ваш пример несколько искусственный.
Конструкторы объектов обычно выдают, если они терпят неудачу. Пройдя несколько раз через new
реализацию в Visual Studio, я не верю, что код перехватывает какие-либо исключения. Поэтому обычно имеет смысл искать исключения при создании объектов.
I думаю, std::bad_alloc
выбрасывается только в случае сбоя при выделении памяти. Я не уверен, что произойдет, если вы передадите std::nothrow
new
, но конструктор объекта выдает - в документах, которые я прочитал, есть неоднозначность.
Разница в производительности между двумя подходами, вероятно, не имеет значения, поскольку большую часть процессорного времени можно легко потратить на конструктор объектов или поиск в куче.
Эмпирическое правило не всегда уместно. Например, системы реального времени обычно ограничивают динамическое распределение памяти, поэтому new
, если он присутствует, вероятно, будет перегружен. В этом случае он может использовать возвращаемый нулевой указатель и обрабатывать ошибки локально.