Читаю статью
Умные указатели в современном C++ с точки зрения н...
В разделе
Рациональное обоснование std::make_unique и std::make_shared приведён текст:
Во-вторых, это делает ваш код защищенным от исключений. Рассмотрим вызов функции, принимающей на вход два умных указателя, следующим образом:
void function(std::unique_ptr<A>(new A()), std::unique_ptr<B>(new B())) { ... }
Предположим, что new A() выполняется успешно, но new B() выбрасывает исключение: вы ловите его, чтобы возобновить нормальное выполнение программы. К сожалению, стандарт C++ не требует, чтобы объект A был уничтожен, а его память высвобождена: память тихо утекает, и нет способа ее очистить.
Возникло несколько связанных вопросов:
1. Это ведь вызов функции, а написано частично как определение функции с void и фигурными скобками. Тут ошибка оформления? Или (сильно сомневаюсь) это действительно определение ф-ии и можно написать определение функции с new в списке аргументов?
2. Если ответ на вопрос 1. что есть ошибка оформления и это действительно вызов ф-ии.
Почему при исключении, объект A не будет удалён? Ведь чуть позже произойдёт в любом случае выход из текущей области видимости, и умный указатель удалится, очистив память. Или я чего-то упустил и по стандарту (рассматриваем C++11) возможно выполнение в порядке
new A
, затем сразу без создания временного объекта
std::unique_ptr<A>(/*ук-ль на объект A*/)
выполнение
new B
?