成员对象为unique_ptr或在堆栈上

时间:2015-03-20 09:58:22

标签: c++ member unique-ptr

目前我正在考虑在unique_ptr中存储一些成员对象。 通常我只在某些函数中使用unique_ptr并移动它,或者传递对它的引用。 那我该怎么做课呢?

Class MyClass {
    std::unique_ptr<MyMemberClass> member;
}

或:

Class MyClass {
    MyMemberClass member;
}

对象的生命周期是相同的。构造函数中的初始化几乎相同。 唯一的区别是,我无法复制unique_ptr,或者?

还有其他差异吗? 我应该使用或更喜欢哪个?

2 个答案:

答案 0 :(得分:2)

  

还有其他差异吗?我应该使用或更喜欢哪个?

这里的决定因素是:

  • 多态行为:如果存储类层次结构的公共接口,则应按指针,智能指针或引用进行存储。

  • 生命周期:正如您所提到的,如果保留的对象的生命周期比MyClass更长(显然,它不属于MyClass),那么它应该保存在原始指针或std :: shared_ptr。

  • 所有权:如果对象不属于MyClass,则应将其存储为指针(智能或非智能)或参考。

    < / LI>
  • api约束:如果保持的对象是由只能动态分配它的库生成的(例如),那么你可能希望将它保存在指针中(或者unique_ptr) )。

当对象由MyClass拥有(排他性)时,它与拥有类具有相同的生命周期,并且您没有多态行为,您应该直接存储该实例。

答案 1 :(得分:0)

的差异:

1)你不能用unique_ptr复制课程(实际上你可以,但这没有任何意义),但你可以移动。

2)如果memberunique_ptr,则应在堆上分配MyMemberClass对象,而在第二种情况下,它在堆栈上分配(当对象类型为{{1}时在堆栈上分配。)

3)如果MyClass是复杂的对象,那么可能存储指针就好了,在其他情况下只是对象就好了。

4)如果membermember,则它可以是多态对象。它允许创建聚合对象。使用第二种形式是不可能的(感谢chmike)。