В этом ответе предполагается, что вы имели в виду return foo
в конце MakeFoo()
. Мой первый выбор - рефакторинг, чтобы не использовать такое динамическое распределение, как показано ниже:
Foo *MakeFoo(){
if(!something)
return 0;
return Combine(SimpleFoo(), SimpleFoo());
}
Foo SimpleFoo(){
Foo foo;
if (something2) // hopefully related to foo. Otherwise, put this condition in MakeFoo
throw std::runtime_error("Error");
return foo;
}
Foo *Combine(const Foo &f1, const Foo &f2){
if (something3)
throw std::runtime_error("Error");
Foo *combination = new Foo;
combination->add(f1);
combination->add(f2);
return combination;
}
Если это не вариант, я бы написал что-то вроде этого в '03:
Foo *MakeFoo(){
auto_ptr<Foo> f1 (SimpleFoo());
if (!f1.get())
return 0;
auto_ptr<Foo> f2> (SimpleFoo());
if (!f2.get())
return f1.release();
Foo *combined = Combine(f1.get(), f2.get());
f1.release();
f2.release();
return combined;
}
Foo *SimpleFoo(){
if (!something)
return 0;
auto_ptr<Foo> f (new Foo);
if (somethingHopefullyRelatedToF)
throw std::runtime_error("Error");
return f.release();
}
unique_ptr
может использоваться одинаково. shared_ptr
также очень широкий молот, который, тем не менее, будет работать для этой проблемы. Я уверен, что приведенные выше примеры не совсем подходят для вашей ситуации, но, надеюсь, они дают вам идеи, которые подходят для вашей проблемы.