Если это какой-то вопрос на собеседовании, скажите интервьюеру, что вы не пишете подобный код, тогда вы получите работу.
Если это домашнее задание, дайте вашему учителю следующую ссылкучтобы он мог чему-то научиться: https://www.aristeia.com/EMC++.html
Наконец, отвечая на ваш вопрос:
int main(int argc, char *argv[]) {
std::unique_ptr<Foo> p[5];
Foo f;
try {
for (int i=0;i<5;++i) {
//p[i]=std::make_unique<Foo>(f); //Only for C++14
p[i]=std::unique_ptr<Foo>(new Foo(f));
}
} catch (...) {
//Nothing, all is done "magically" by unique_ptr
}
}
Теперь, на самом деле, отвечая на ваш вопрос и делая ваш код еще более надуманным, вы можете использоватьtry-catch списка инициализаторов конструктора (подробнее здесь )
class Foo {
public:
int *x;
mutable size_t count {1};
Foo() : x {new int} {}
Foo(const Foo &rhs) try: x {new int} {
if(++rhs.count > 5) {
throw runtime_error("");
}
} catch (...) {
delete x;
throw;
}
~Foo() {
delete x;
}
Foo &operator=(const Foo &) = delete;
};
Основное - то же, что и ваше.