2016-08-01 69 views
5

我有具有这些对象的寿命都应该由A的寿命智能指针与值作为成员变量

我考虑被限制的类型M和N的成员变量A类

class A { 
    M member1; 
    N member2; 
} 

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

我不能完全肯定这是更好的,因为他们都做到我想要的东西。成员的生命周期绑定到对象上,我不需要手动管理内存。每个设置有哪些优缺点?

+5

如果没有理由有指针为什么有指针?所有成员在析构函数中被“销毁”。 – NathanOliver

+0

你*想要创建'M'和'N'作为指针的唯一时间就是它们非常大的地方,并且在堆栈上创建它们可能会导致你用尽堆栈空间 –

+2

只有使用动态分配有一个理由,并有一个很好的理由。例如,如果你的成员对象是巨大的并且可能粉碎堆栈。否则,不要毫无意义地引入动态分配/间接的开销。 –

回答

2

它取决于类型NM的大小以及您打算如何使用class A

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

希望这是明确的。

4

使用std ::的unique_ptr如果

  1. M和N是多态的层次结构的基础类
  2. 的member1和member2是可选的构件,其可以nullptr
  3. M和N是足够大的以致无法在程序栈
+0

这些都是**所有**的thumb_和发生? –

3

是的分配,都是正确的,但是......

通常,动态分配对象与将它们保持为简单成员是额外的成本。您不得不支付从免费商店分配内存开销,而不是简单地使用分配给他们所属的A的memroy。每当你需要访问它们时,你也会有间接参考。

仍然如果费用买了你什么东西,可能想要去智能指针路线。例如:

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