從C++ 11我可以在不創建和刪除原始指針的情況下編寫代碼。 但它是正確的方式去 - 我應該總是使用智能指針(無論是共享的,獨特的或弱)或有我應該刪除自己的對象的情況?我應該總是在C++中使用智能指針11
回答
很難想象你想要手動刪除一個對象的情況,所以從這個意義上說,你的問題的答案是「是的,總是使用智能指針」。
但是,原始指針確實有另一個用例。智能指針全部是關於賦予所有權語義。 A unique_ptr
擁有它指向的對象的獨佔所有權,並且在指針超出範圍時將銷燬該對象。 A shared_ptr
implements 共享所有權,並且當最後一個共享指針超出作用域時,該對象將被銷燬。
原始指針在您希望指向指示任何類型所有權的對象而沒有的情況下仍然有用。你只是指向一個你知道存在的對象,而其他人(擁有者)會在時間到時將其刪除。
原始指針用於指向對象。智能指針用於擁有對象。
寫得很好的代碼中的大多數刪除是'delete this'。這是否算作「手動刪除」一個對象。如果你不想明確控制一個對象的生命週期,首先要問的問題是:我爲什麼要動態分配它? –
@JamesKanze:我還沒有看到很多包含「delete this」的「寫得很好」的代碼。我很確定我們不同意C++代碼的寫法。除此之外,我不確定如何回答你。我不確定在對象的生命週期中「明確控制」你的意思。如果我使用'unique_ptr'或'shared_ptr',我有明確的控制嗎?我確切地控制它應該被刪除的時間,但我沒有明確地將代碼放在我想要刪除的網站上。我通常會*想*控制對象的生命週期。這就是我使用智能指針的原因。 – jalf
我也不確定你認爲什麼是「動態分配」。一個'std :: vector'在內部使用動態分配,但它不能直接被用戶看到。你是否建議我們甚至不應該那樣做,並且讓應用程序完全依賴於堆棧,而不管你想要分配多少內存? – jalf
確實很少有情況下,您想使用智能指針 。在大多數應用程序中,大多數刪除操作都是 delete this
,或者如果應用程序是事務性的,則事務管理器將負責刪除操作。在不適用 的情況下,您通常不希望首先使用 動態分配。現在唯一時候,你會 使用智能指針:
出於某種原因或其他,你不能使物體在構造完全 運行,但必須跟進 額外行動之前,它是活躍的。在這種情況下,它使得 有意義,以使其保持在
std::unique_ptr
中,直到對象爲 完全活動,然後致電release
。你真的想要價值的語義,但你也需要 多態性。在這種情況下,使用某種共享指針。 (但要注意週期。)如果對象是可變的,請注意, 因爲最終會引用參考語義。
你真的想要價值語義(與深拷貝),但 探查器顯示覆製成本太高,你可能也會考慮某種共享指針。這有它的 的危險,但對於大塊不可變的數據,可以是一個很好的 解決方案。
但是對於初學者來說,你應該總是問自己:爲什麼我 我動態分配此對象。最常見的有效原因是它是一個實體對象,通過程序邏輯定義的生命週期爲 (即其生命週期由於某些外部事件而結束)。在這種情況下,智能指針會導致更多的問題,而不是他們解決的問題。
沒有動態分配?你會如何爲視頻遊戲加載一堆資產?如果你申請RAII,你的第一點是錯誤的。 – Syl
@Syl我沒有說沒有動態分配。我說你只在適當的時候才使用動態分配。在視頻遊戲中,會有很多動態分配的對象:代表玩家的對象和各種對象。但它們都是實體對象;你不會用智能指針來管理它們(或者至少不是我見過的任何智能指針)。如果一個怪物向你施放破壞你盔甲的東西,你的盔甲應該被破壞,無論如何;你不希望它閒逛,因爲還有一個指向它的共享指針。 –
@Syl我的第一點恰恰是RAII。只要「資源」(新創建的對象)是短暫的,並且如果它超出了範圍就應該被銷燬,您將它保存在一個智能指針中。當然,一旦它不再是短暫的,並且必須超出範圍,你必須從智能指針中取出它,因爲RAII(儘管它的名字更關心自動銷燬)不再適用。 –
- 1. C++ 11:智能指針使用
- 2. C++ 11智能指針總是代替新的/刪除?
- 3. 我的函數應該接受指針還是智能指針?
- 4. C++ 11智能指針和多態性
- 5. C++ - 智能指針 - 在模板中投射智能指針
- 6. 我應該使用哪個智能指針?
- 7. C++智能指針
- 8. C++中的智能指針
- 9. 什麼時候應該在智能指針上使用原始指針?
- 10. 我爲什麼要在智能指針上使用智能指針作爲C++中的參數引用
- 11. 如何使用C++智能指針?
- 12. 存儲在C++ 11智能指針一個std ::螺紋
- 13. C++:實現智能指針
- 14. C++智能指針表現
- 15. 我應該手動刪除智能指針嗎?
- 16. C++ 11檢查COM智能指針的成員
- 17. C++ 11智能指針的複合模式
- 18. 轉換爲非標量類型與std C++ 11智能指針
- 19. 在C++智能指針中使用循環的引用計數
- 20. 我應該將帶有內存泄漏的庫轉換爲C++ 11的智能指針嗎?
- 21. 針對directx的C++智能指針
- 22. 在mbed上使用智能指針
- 23. 智能指針在智能指針管理數組內
- 24. C++ API中的智能指針?
- 25. 智能指針和地圖在C++
- 26. 在C++中使用智能指針的Const
- 27. 使用智能指針在C++中的「觀察者模式」?
- 28. 在C++中聲明使用智能指針的雙向矩陣
- 29. 當析構函數是私有的時,我應該如何在C++ 11中使用唯一指針?
- 30. 與智能指針
我被建議問另一個問題。我沒有收到原始問題的答案 –
其實,您的其他問題已作爲重複結案。重複的答案非常好。 – juanchopanza
再次?真的嗎?你是一個非常有經驗的用戶(200多個問題),**學習做研究** – TemplateRex