Должен ли я назначить или reset уникальный_ptr?
Учитывая общую ситуацию, когда срок службы принадлежащего ему объекта связан с его владельцем, я могу использовать уникальный указатель одним из двух способов.,
Он может быть назначен:
class owner
{
std::unique_ptr<someObject> owned;
public:
owner()
{
owned=std::unique_ptr<someObject>(new someObject());
}
};
Можно использовать метод reset:
class owner
{
std::unique_ptr<someObject> owned;
public:
owner()
{
owned.reset(new someObject());
}
};
В интересах лучшей практики я должен предпочесть одну форму над другой?
РЕДАКТИРОВАТЬ: Извините. Я более упростил это. Распределение кучи происходит в инициализационном методе, а не в ctor. Поэтому я не могу использовать списки инициализаторов.
Ответы
Ответ 1
Из документов unique_ptr
operator=
:
Передает право собственности на объект, на который указывает r, на * это как на вызов reset(r.release())
, за которым следует назначение из std::forward<E>(r.get_deleter())
.
И все, что вам нужно, это вызов reset
, поэтому проще просто вызвать его напрямую
Ответ 2
Правильный способ сделать это (который вы не указали) состоит в использовании конструктора owned
:
owner() : owned(new someObject())
{}
Кроме того, я бы предпочел reset
, поскольку в этом случае вы не создадите бесполезный промежуточный экземпляр (хотя на уровне машины не может быть никакой разницы, так как оптимизатор может многое сделать).