C++ 分配C++;类成员数据?

C++ 分配C++;类成员数据?,c++,memory-management,C++,Memory Management,假设我有一个类,它分配一些任意的成员数据。我见过两种常用的方法(我知道还有其他方法): 对 class A { public: //Accessors... private: B mB; } 假设使用者代码将在堆上分配A本身 一般情况下,首选哪种方法?我意识到,特定的情况确实鼓励这样或那样的方式,但在没有这些要求的情况下,是一种方式更可取吗?折衷是什么?第二条是首选路线。不要使用new/delete,除非您特别需要一个变量位于堆中或其生存期长于其

假设我有一个类,它分配一些任意的成员数据。我见过两种常用的方法(我知道还有其他方法):

class A
{
    public:
        //Accessors...
    private:
        B mB;
}
假设使用者代码将在堆上分配A本身


一般情况下,首选哪种方法?我意识到,特定的情况确实鼓励这样或那样的方式,但在没有这些要求的情况下,是一种方式更可取吗?折衷是什么?

第二条是首选路线。不要使用new/delete,除非您特别需要一个变量位于堆中或其生存期长于其容器。C++值类型更容易管理,错误案例更少,担心IMHO/P>P>一般,倾向于直接作文(第二选择)。在这种情况下,不存在内存泄漏的可能性,并且对象完全位于连续内存块中,从而允许更好的缓存局部性

如果要实现PIMPL,或者需要使用几种可能的类类型之一(通过继承),则可以使用第一个选项。在这种情况下,一定要使用智能指针(
boost::shared_ptr
)为您管理内存。

视情况而定

一般来说,如果一个B很大而且很笨拙,那么传递一个指向B的指针比传递B本身更容易。因此,如果B经常与A分离(如果A交换B,则为f),那么第一种方法更好

使用指针还可以减少依赖性。如果你做得好,
A.hh
可以通过,而无需说明B是什么或做什么(即
A.h
不需要
#包括“B.hh”
),这样依赖于
A.hh
的东西就不一定依赖于
B.hh


使用指针的代价是额外的一层机制,以及诸如丢失对象、双重删除和取消对未初始化指针的引用之类的危险,因此不应该使用指针,除非它在您的情况下确实有好处。有些人爱上了指针技术,并在任何地方使用它们;如果他们想作为程序员提高,他们就必须摆脱它。

这主要取决于你在寻找什么

为了简单起见:不要使用指针。因此,第二个选择

它更易于管理(无需担心内存管理、深度复制、深度常量等)

但是,有时您可能需要动态分配属性:

  • 如果您需要多态性(否则您有一个截断)
  • 如果要减少依赖项(在头文件中)-->请参阅

即使在这种情况下,将责任移交给智能管理器(智能指针、专用pimpl类等)

也无法回答该问题,除非知道“B”是否也可能依赖于“a”。默认复制/分配中的指针会发生有趣的事:-X
class A
{
    public:
        //Accessors...
    private:
        B mB;
}