2016-08-01 66 views
5

我有具有這些對象的壽命都應該由A的壽命智能指針與值作爲成員變量

我考慮被限制的類型M和N的成員變量A類

class A { 
    M member1; 
    N member2; 
} 

class A { 
    std::unique_ptr<M> member1; 
    std::unique_ptr<N> member2; 
} 

我不能完全肯定這是更好的,因爲他們都做到我想要的東西。成員的生命週期綁定到對象上,我不需要手動管理內存。每個設置有哪些優缺點?

+5

如果沒有理由有指針爲什麼有指針?所有成員在析構函數中被「銷燬」。 – NathanOliver

+0

你*想要創建'M'和'N'作爲指針的唯一時間就是它們非常大的地方,並且在堆棧上創建它們可能會導致你用盡堆棧空間 –

+2

只有使用動態分配有一個理由,並有一個很好的理由。例如,如果你的成員對象是巨大的並且可能粉碎堆棧。否則,不要毫無意義地引入動態分配/間接的開銷。 –

回答

2

它取決於類型NM的大小以及您打算如何使用class A

  1. 如果類型NM是小的,即,一個機器字,然後將具有創建和維護的指針的額外開銷是空間和時間的浪費。
  2. 如果類型NM非常大,並且您計劃在棧上聲明class A的對象,那麼最好使用指針。在這種情況下,類型爲NM的大對象將被分配到堆區(並且最可能阻止您調試非常討厭的堆棧溢出問題)。
  3. 另一方面,如果您計劃動態分配class A的對象,那麼使用成員變量就足夠了,因爲在這種情況下,所有內容都將分配到堆區中,並且您還將節省開銷。

希望這是明確的。

4

使用std ::的unique_ptr如果

  1. M和N是多態的層次結構的基礎類
  2. 的member1和member2是可選的構件,其可以nullptr
  3. M和N是足夠大的以致無法在程序棧
+0

這些都是**所有**的thumb_和發生? –

3

是的分配,都是正確的,但是......

通常,動態分配對象與將它們保持爲簡單成員是額外的成本。您不得不支付從免費商店分配內存開銷,而不是簡單地使用分配給他們所屬的A的memroy。每當你需要訪問它們時,你也會有間接參考。

仍然如果費用買了你什麼東西,可能想要去智能指針路線。例如:

  1. 您可能想要在整個A對象的生命週期中更改member1或member2的值。如果M和N對象很大,智能指針方法可以使這種廉價操作成爲可能。
  2. 您可能想要利用多態性。如果M或N是基類,那麼基於指針的實現可以靈活地使用M或N的子類。
  3. 基於指針的實現可以允許您延遲分配member1或member2,直到更晚,更合適, A在生命週期中的時間。