2010-10-07 16 views
6

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

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

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

在另一部分中,我保存指向由應用程序中的其他模塊交付的實例的指針集合。在實踐中,其他模塊保持傳遞實例的所有權,但在某些情況下,模塊不希望關注所有權,只是想將實例傳遞給集合,告訴它「現在是你的,管理它」。

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

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

Replacing existing raw pointers with smart pointers這個問題似乎很相似,但我不問它有多容易,而是問最好的方法是什麼,以及哪種智能指針最適合。

在此先感謝您的意見和建議。

回答

1

下面是在新的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對象是否仍然存在。

3

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

+0

+1好建議。你必須做大量的對象創建/銷燬或指針複製才能看到'shared_ptr'和'intrusive_ptr'之間的性能差異。 – Doug 2010-10-07 11:05:17