分配C ++类成员数据的首选方法是什么?

时间:2010-09-01 15:14:36

标签: c++ memory-management

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

class A
{
    public:
        A();
        ~A();

        //Accessors...
    private:
        B *mB;
}

A::A()
{
    mB = new B();
}

A::~A()
{
    delete B;
}

...对战

class A
{
    public:
        //Accessors...
    private:
        B mB;
}

假设消费者代码将在堆上分配A本身。

在一般情况下,首选哪种方法?我意识到特定情况确实鼓励这种或那种方式,但如果没有这些要求,是一种优先选择的方式吗?有什么权衡?

4 个答案:

答案 0 :(得分:9)

第二种是首选路线。除非您特别需要变量在堆上或者其生命周期长于容器,否则不要使用new / delete。 C ++值类型更容易管理,并且担心恕我直言的错误案例更少

答案 1 :(得分:4)

取决于。

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

使用指针也可以减少依赖性。如果你做得对,A.hh可以在没有指明B是什么或做什么的情况下(即A.h不需要#include "B.hh"),以便依赖于A.hh赢得的东西'这必然取决于B.hh

使用指针的代价是一个额外的机器层和丢失对象,双删除和未初始化指针的解除引用之类的东西的危险,所以它不应该被使用,除非它实际上给你的情况带来好处。有些人爱上指针技术并随处使用它们;如果他们想要作为程序员改进,他们必须从中成长。

答案 2 :(得分:0)

一般来说,喜欢直接成分(第二选择)。在这种情况下,没有泄漏内存的可能性,并且对象完全位于连续的内存块中,从而允许更好的缓存局部性。

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

答案 3 :(得分:0)

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

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

管理起来更容易(无需担心内存管理,深度复制,深度常量等等。)

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

  • 如果你需要多态(否则你有截断)
  • 如果你想减少你的依赖关系(在头文件中) - >见PIMPL here

即使在这种情况下,将责任移交给智能管理员(智能指针,专用pimpl课程等......)