我应该分配还是重置unique_ptr?

lea*_*vst 62 c++ smart-pointers unique-ptr c++11

鉴于自有对象的生命周期与其所有者链接的常见情况,我可以使用两种方式之一的唯一指针..

它可以分配:

class owner
{
    std::unique_ptr<someObject> owned;    
public:
    owner()
    {
        owned=std::unique_ptr<someObject>(new someObject());        
    }
};
Run Code Online (Sandbox Code Playgroud)

可以使用重置方法:

class owner
{
    std::unique_ptr<someObject> owned;    
public:
    owner()
    {
        owned.reset(new someObject());
    }
};
Run Code Online (Sandbox Code Playgroud)

为了最佳实践,我应该更喜欢一种形式吗?

编辑:对不起伙计们.我简化了这个.堆分配发生在初始化方法中,而不是在ctor中.因此,我无法使用初始化列表.

Kos*_*Kos 40

的文档unique_ptroperator=:

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

而你所需要的reset只是通话,所以直接调用就更简单了

  • 我知道现在已经很晚了,但仅限于未来的读者.根据Scott Meyers在他的书"Effective Modern C++"中的说法,std :: make_unique <T>更可取,因为它提供了异常安全性:owner = std :: make_unique <someObject>().问题是std :: make_unique <T>是C++ 14(不是C++ 11)的一部分,但在这里你可以找到[here](https://isocpp.org/files/papers/N3656.txt )一个很好的实现,你可以复制粘贴. (41认同)

fil*_*mor 15

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

owner() : owned(new someObject())
{}
Run Code Online (Sandbox Code Playgroud)

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

  • "我更喜欢重置,因为你没有创建一个无用的中间实例" - 得到它.谢谢 (2认同)