2010-09-01 45 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

即使在這種情況下,雖然交工責任到智能管理器(智能指針,專用的平普爾類,等...)

相關問題