2014-02-12 75 views
0

從C++ 11我可以在不創建和刪除原始指針的情況下編寫代碼。 但它是正確的方式去 - 我應該總是使用智能指針(無論是共享的,獨特的或弱)或有我應該刪除自己的對象的情況?我應該總是在C++中使用智能指針11

+0

我被建議問另一個問題。我沒有收到原始問題的答案 –

+2

其實,您的其他問題已作爲重複結案。重複的答案非常好。 – juanchopanza

+3

再次?真的嗎?你是一個非常有經驗的用戶(200多個問題),**學習做研究** – TemplateRex

回答

15

很難想象你想要手動刪除一個對象的情況,所以從這個意義上說,你的問題的答案是「是的,總是使用智能指針」。

但是,原始指針確實有另一個用例。智能指針全部是關於賦予所有權語義。 A unique_ptr擁有它指向的對象的獨佔所有權,並且在指針超出範圍時將銷燬該對象。 A shared_ptr implements 共享所有權,並且當最後一個共享指針超出作用域時,該對象將被銷燬。

原始指針在您希望指向指示任何類型所有權的對象而沒有的情況下仍然有用。你只是指向一個你知道存在的對象,而其他人(擁有者)會在時間到時將其刪除。

原始指針用於指向對象。智能指針用於擁有對象。

+1

寫得很好的代碼中的大多數刪除是'delete this'。這是否算作「手動刪除」一個對象。如果你不想明確控制一個對象的生命週期,首先要問的問題是:我爲什麼要動態分配它? –

+2

@JamesKanze:我還沒有看到很多包含「delete this」的「寫得很好」的代碼。我很確定我們不同意C++代碼的寫法。除此之外,我不確定如何回答你。我不確定在對象的生命週期中「明確控制」你的意思。如果我使用'unique_ptr'或'shared_ptr',我有明確的控制嗎?我確切地控制它應該被刪除的時間,但我沒有明確地將代碼放在我想要刪除的網站上。我通常會*想*控制對象的生命週期。這就是我使用智能指針的原因。 – jalf

+0

我也不確定你認爲什麼是「動態分配」。一個'std :: vector'在內部使用動態分配,但它不能直接被用戶看到。你是否建議我們甚至不應該那樣做,並且讓應用程序完全依賴於堆棧,而不管你想要分配多少內存? – jalf

0

確實很少有情況下,您想使用智能指針 。在大多數應用程序中,大多數刪除操作都是 delete this,或者如果應用程序是事務性的,則事務管理器將負責刪除操作。在不適用 的情況下,您通常不希望首先使用 動態分配。現在唯一時候,你會 使用智能指針:

  • 出於某種原因或其他,你不能使物體在構造完全 運行,但必須跟進 額外行動之前,它是活躍的。在這種情況下,它使得 有意義,以使其保持在std::unique_ptr中,直到對象爲 完全活動,然後致電release

  • 你真的想要價值的語義,但你也需要 多態性。在這種情況下,使用某種共享指針。 (但要注意週期。)如果對象是可變的,請注意, 因爲最終會引用參考語義。

  • 你真的想要價值語義(與深拷貝),但 探查器顯示覆製成本太高,你可能也會考慮某種共享指針。這有它的 的危險,但對於大塊不可變的數據,可以是一個很好的 解決方案。

但是對於初學者來說,你應該總是問自己:爲什麼我 我動態分配此對象。最常見的有效原因是它是一個實體對象,通過程序邏輯定義的生命週期爲 (即其生命週期由於某些外部事件而結束)。在這種情況下,智能指針會導致更多的問題,而不是他們解決的問題。

+0

沒有動態分配?你會如何爲視頻遊戲加載一堆資產?如果你申請RAII,你的第一點是錯誤的。 – Syl

+0

@Syl我沒有說沒有動態分配。我說你只在適當的時候才使用動態分配。在視頻遊戲中,會有很多動態分配的對象:代表玩家的對象和各種對象。但它們都是實體對象;你不會用智能指針來管理它們(或者至少不是我見過的任何智能指針)。如果一個怪物向你施放破壞你盔甲的東西,你的盔甲應該被破壞,無論如何;你不希望它閒逛,因爲還有一個指向它的共享指針。 –

+1

@Syl我的第一點恰恰是RAII。只要「資源」(新創建的對象)是短暫的,並且如果它超出了範圍就應該被銷燬,您將它保存在一個智能指針中。當然,一旦它不再是短暫的,並且必須超出範圍,你必須從智能指針中取出它,因爲RAII(儘管它的名字更關心自動銷燬)不再適用。 –