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

use*_*740 6 c++ class smart-pointers member

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

我在考虑

class A {
    M member1;
    N member2;
}
Run Code Online (Sandbox Code Playgroud)

class A {
    std::unique_ptr<M> member1;
    std::unique_ptr<N> member2;
}
Run Code Online (Sandbox Code Playgroud)

我不完全确定哪个更好,因为它们都能实现我想要的.成员的生命周期绑定到对象,我不需要手动管理内存.每个设置有哪些优缺点?

Ana*_*lyS 6

如果使用std :: unique_ptr

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


ily*_*725 2

这取决于类型的大小N以及M您计划使用的方式class A

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

希望这一点是清楚的。