Давайте предположим, что мы имеем следующий фрагмент кода:Определен внутренний порядок выполнения в параметрах функции?
void foo(std::unique_ptr<Data> p1, std::unique_ptr<Data> p2){
bar(p1);
bar(p2);
}
int main(){
foo(std::unique_ptr<Data>{new Data}, std::unique_ptr<Data>{new Data});
}
Вопрос: будет ли память всегда быть освобождены от выполнения этого кода (независимо от того, что происходит)?
Стандарт говорит, что мы не можем полагаться на порядок утверждений, являющихся аргументами функции, но как насчет внутренних вызовов функций/распределения памяти и т. Д.? Это даже важно здесь?
Неплохая практика иметь конструкторы, которые могут бросать? – user3853544
@ user3853544 'operator new' может выбрасывать – Caleth
@ user3853544 Зависит: если вы всегда хотите иметь объекты в правильном состоянии (без конструирования, а затем проверки, являются ли они действительными), вы можете использовать их для этого. – Patryk