78

鉴于拥有对象的生命周期与其所有者相关联的常见情况,我可以使用以下两种方式之一的唯一指针。.

它可以分配:

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

4

2 回答 2

52

来自's的文档unique_ptroperator=

将 r 指向的对象的所有权转移到 *this,就像通过调用reset(r.release())后跟来自 的赋值一样std::forward<E>(r.get_deleter())

而你所需要的就是reset调用,所以直接调用它更简单

于 2013-04-17T13:40:36.417 回答
18

执行此操作的正确方法(您没有列出)是使用以下构造函数owned

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

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

于 2013-04-17T13:33:50.220 回答