簡體   English   中英

在C ++中開始使用智能指針

[英]Getting started with smart pointers in C++

我有一個C ++應用程序,它廣泛使用指針來維護非常復雜的數據結構。 該應用程序對大型數據集(可能需要幾GB內存)執行數學模擬,並使用Microsoft的Visual Studio 2010進行編譯。

我現在正在重新設計應用程序的一個重要部分。 為了減少錯誤(懸空指針,內存泄漏......),我想開始使用智能指針。 只要受到限制,犧牲記憶或表現就是可以接受的。

實際上,大多數類都在大型池中維護(每個類一個池),盡管這些類可以相互引用,但您可以將池視為該類所有實例的所有者。 但是,如果池決定刪除實例,我不希望仍然引用已刪除實例的任何其他類具有懸空指針。

在另一部分中,我保留了一組指向應用程序中其他模塊提供的實例的指針。 在實踐中,其他模塊保持傳遞的實例的所有權,但在某些情況下,模塊不想處理所有權,只是想將實例傳遞給集合,告訴它“它現在是你的,管理它”。

開始引入智能指針的最佳方法是什么? 用智能指針替換[隨機]指針似乎不是正確的方法,並且可能無法提供智能指針的所有(或任何)優勢。 但什么是更好的方法?

我應該進一步調查哪些類型的智能指針? 我有時使用std :: auto_ptr來釋放本地分配的內存,但這似乎在C ++ 0x中被刪除了。 std :: unique_ptr是更好的選擇嗎? 或者我應該直接使用共享指針或其他類型的智能指針?

用智能指針替換現有原始指針的問題似乎相似,但不是問它有多容易,我問的是最好的方法是什么,以及哪種智能指針最適合。

提前感謝您的想法和建議。

我建議盡可能使用unique_ptr (這可能需要一些程序分析)和shared_ptr ,這是不可能的。 如果有疑問,請使用shared_ptr來最大限度地提高安全性:當將控制權交給容器時,引用計數將簡單地轉到2,然后返回到1,容器最終delete自動delete關聯的對象。 當性能成為問題時,請考慮使用boost::intrusive_ptr

以下是新C ++ 11標准中的3個品種(unique_ptr取代auto_ptr)

http://www.stroustrup.com/C++11FAQ.html#std-unique_ptr

http://www.stroustrup.com/C++11FAQ.html#std-shared_ptr

http://www.stroustrup.com/C++11FAQ.html#std-weak_ptr

您可以閱讀每個指針的文本,並說明何時使用哪個指針。 對於本地內存管理,unique_ptr是您的選擇。 它是不可復制的,但是可移動的,因此當你在接收器周圍移動它時它擁有它。

如果你想共享一個對象實例而沒有人真正擁有該對象,並且確保在有人仍然引用它時不會刪除它,則使用Shared_ptr。 一旦對象的最后一個用戶破壞了shared_ptr容器,就會刪除包含的對象。

weak_ptr與shared_ptr一起使用。 它允許一個人“鎖定”以在嘗試訪問內部對象之前查看引用shared_ptr對象是否仍然存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM