智能指针与值作为成员变量
问题描述:
我有具有这些对象的寿命都应该由A的寿命智能指针与值作为成员变量
我考虑被限制的类型M和N的成员变量A类
class A {
M member1;
N member2;
}
与
class A {
std::unique_ptr<M> member1;
std::unique_ptr<N> member2;
}
我不能完全肯定这是更好的,因为他们都做到我想要的东西。成员的生命周期绑定到对象上,我不需要手动管理内存。每个设置有哪些优缺点?
答
它取决于类型N
和M
的大小以及您打算如何使用class A
。
- 如果类型
N
和M
是小的,即,一个机器字,然后将具有创建和维护的指针的额外开销是空间和时间的浪费。 - 如果类型
N
和M
非常大,并且您计划在栈上声明class A
的对象,那么最好使用指针。在这种情况下,类型为N
和M
的大对象将被分配到堆区(并且最可能阻止您调试非常讨厌的堆栈溢出问题)。 - 另一方面,如果您计划动态分配
class A
的对象,那么使用成员变量就足够了,因为在这种情况下,所有内容都将分配到堆区中,并且您还将节省开销。
希望这是明确的。
答
使用std ::的unique_ptr如果
- M和N是多态的层次结构的基础类
- 的member1和member2是可选的构件,其可以nullptr
- M和N是足够大的以致无法在程序栈
+0
这些都是**所有**的thumb_和发生? –
答
是的分配,都是正确的,但是......
通常,动态分配对象与将它们保持为简单成员是额外的成本。您不得不支付从免费商店分配内存开销,而不是简单地使用分配给他们所属的A的memroy。每当你需要访问它们时,你也会有间接参考。
你仍然如果费用买了你什么东西,可能想要去智能指针路线。例如:
- 您可能想要在整个A对象的生命周期中更改member1或member2的值。如果M和N对象很大,智能指针方法可以使这种廉价操作成为可能。
- 您可能想要利用多态性。如果M或N是基类,那么基于指针的实现可以灵活地使用M或N的子类。
- 基于指针的实现可以允许您延迟分配member1或member2,直到更晚,更合适, A在生命周期中的时间。
如果没有理由有指针为什么有指针?所有成员在析构函数中被“销毁”。 – NathanOliver
你*想要创建'M'和'N'作为指针的唯一时间就是它们非常大的地方,并且在堆栈上创建它们可能会导致你用尽堆栈空间 –
只有使用动态分配有一个理由,并有一个很好的理由。例如,如果你的成员对象是巨大的并且可能粉碎堆栈。否则,不要毫无意义地引入动态分配/间接的开销。 –