我应该分配或重置unique_ptr吗?


71

在通常情况下,拥有对象的生命周期与其拥有者相关联,我可以使用2种方法之一的唯一指针。。

可以分配:

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进行。因此,我不能使用初始化程序列表。

Answers:


48

的文档unique_ptroperator=

将r指向的对象的所有权转移到* this,就好像是先调用,reset(r.release())然后是分配std::forward<E>(r.get_deleter())

而您所需要的reset只是调用,因此直接调用它更简单


48
我知道已经很晚了,但只供将来的读者使用。根据Scott Meyers在他的书《有效的现代C ++》中,std :: make_unique <T>是更可取的,因为它提供了异常安全性:owner = std :: make_unique <someObject>()。问题是,标准:: make_unique <T>是C ++ 14(不是C ++ 11)的一部分,但在这里你可以找到这里一个很好的实现,你可以复制粘贴。
弗朗西斯·莫伊

17

正确的方法(您没有列出)是使用的构造函数owned

owner() : owned(new someObject())
{}

除此之外,我希望reset您不要在这种情况下创建无用的中间实例(尽管在机器级别上可能没有区别,因为优化器可以在那里做很多事情)。


2
“我宁愿重置,因为您不会创建无用的中间实例”-可以了。谢谢
Learnvst 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.