2010-09-01 74 views
3

比方说,我有一个分配一些任意成员数据的类。有迹象表明,我已经看到了使用两种常用的方法(我知道还有其他人):分配C++类成员数据的首选方式是什么?

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本身对消费者的代码在堆上分配。

在一般情况下,哪种方法是首选?我意识到具体情况确实鼓励某种方式,但在没有这些要求的情况下,一种方式是优选的吗?什么是权衡?

+1

发现内存泄露。 – 2010-09-01 15:20:42

+0

不能回答这个问题,除非知道'B'是否也可能取决于'A'。 – Chubsdad 2010-09-01 15:31:44

+0

有趣的事情发生在默认复制/分配指针。 :-X – Anycorn 2010-09-01 15:35:11

回答

9

第二个是首选路线。除非特别需要变量放在堆上或使用寿命比容器长,否则不要使用new/delete。 C++值类型更容易管理,并且有更少的错误情况来担心恕我直言。

0

通常,更喜欢直接组合(第二选择)。在这种情况下,不会有内存泄漏的机会,并且对象完全位于连续的内存块中,从而实现更好的缓存局部性。

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

4

这取决于。

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

使用指针还可以减少依赖关系。如果你做得对,A.hh可以在没有指定B是什么的情况下得到(即A.h不需要#include "B.hh"),因此取决于A.hh的事情不一定取决于B.hh

使用指针的价格是一个额外的机制层和丢失的对象,双重删除和取消初始化指针的解除引用的危险,所以它不应该被使用,除非它实际上给你的情况带来好处。有些人爱上指针技术并随处使用它们;如果他们想要提高程序员的素质,他们必须从中发展壮大。

0

它主要取决于你在找什么。

对于简单的缘故:不要使用指针。因此,第二选择。

它更容易管理(不需要担心内存管理,深层复制,深层次的常量等)。

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

  • 如果你需要多态(否则你有一个截断)
  • ,如果你想降低您的依赖关系(在头文件)
  • - >看到PIMPL here

即使在这种情况下,虽然交工责任到智能管理器(智能指针,专用的平普尔类,等...)

相关问题