Двухэтапная конструкция принимает следующую форму:
struct something {
something ()
: p1(NULL)
, p2(NULL)
{ }
~something () {
if (p1) delete p1;
if (p2) delete p2;
}
void initialize () {
p1 = new int(2);
p2 = new int(5); // May throw if allocation fails!
}
int* p1;
int* p2;
};
Дело в том, что наивный конструктор (который не следит за ошибками выделения памяти) будет вызывать утечку памяти: частично построенный объект деструктор никогда не вызывается.
Мой вопрос: безопасен ли следующий код и, судя по всему, исключают ли интеллектуальные указатели двухфазное построение?
struct something {
something ()
: p1(new int(2))
, p2(new int(5))
{ }
std::unique_ptr<int> p1;
std::unique_ptr<int> p2;
};