Исключают ли интеллектуальные указатели необходимость в двухфазной конструкции?

Двухэтапная конструкция принимает следующую форму:

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;
};
6
задан Andres Jaan Tack 2 December 2011 в 17:21
поделиться