智能指针与值作为成员变量

时间:2016-08-01 19:06:18

标签: c++ class smart-pointers member

我有一个类A,其成员变量类型为M和N.这些对象的生命周期应该受到A的生命周期的限制。

我在考虑

class A {
    M member1;
    N member2;
}

VS

class A {
    std::unique_ptr<M> member1;
    std::unique_ptr<N> member2;
}

我不完全确定哪个更好,因为它们都能实现我的目标。成员的生命周期绑定到对象,我不需要手动管理内存。每种设置的优点和缺点是什么?

3 个答案:

答案 0 :(得分:4)

使用std :: unique_ptr if

  1. M和N是多态层次结构的基类
  2. member1和member2是可选成员,可以是nullptr
  3. M和N足够大,无法在程序堆栈上分配

答案 1 :(得分:4)

是的,两者都是正确的,但是......

通常,动态分配对象需要额外的成本,而不是将它们保持为简单的成员。你必须支付从免费商店分配存储器的edtra开销,而不是简单地使用为它们所属的A分配的memroy。无论何时需要访问它们,您都会有间接引用。

如果成本购买了某些东西,仍然可能想要进入智能指针路线。例如:

  1. 您可能希望在A对象的整个生命周期中更改member1或member2的值。如果M和N对象很大,智能指针方法可以使其成为一种廉价的操作。
  2. 您可能希望利用多态性。如果M或N是基类,则基于指针的实现可以灵活地使用M或N的子类。
  3. 基于指针的实现可以允许您延迟分配member1或member2,直到A的生命周期中的更晚,更合适的时间。

答案 2 :(得分:2)

取决于类型NM的大小以及您计划如何使用class A

  1. 如果类型NM很小,即一个机器字,那么创建和维护指针的额外开销就是浪费空间和时间。
  2. 如果类型NM非常大并且您打算在堆栈上声明class A的对象,那么最好使用指针。在这种情况下,类型NM的大对象将在堆区域中分配(并且大多数可能阻止您调试非常讨厌的堆栈溢出问题)。
  3. 另一方面,如果您计划动态分配class A的对象,那么拥有成员变量就足够了,因为在这种情况下,所有内容都将在堆区域中分配,并且您还将保存在开销。
  4. 希望这很清楚。