我經常使用shared_ptr。
由於Shared_ptr是按值複製的,因此可能會產生複製指針值和引用計數兩者的代價,但如果使用boost :: intrusive_ptr,則引用計數必須添加到您的類中,並且存在沒有使用原始指針的額外開銷。
但是,根據我的經驗,超過99%的時間,在整個代碼中複製boost :: shared_ptr實例的開銷並不重要。通常,正如C.A.R.Hoare指出的那樣,不成熟的優化是毫無意義的 - 大多數情況下,其他代碼將使用比複製小對象更多的時間。你的旅費可能會改變。如果分析顯示覆制是一個問題,則可以切換到侵入指針。
如前所述,週期必須通過使用weak_ptr來中斷,否則會出現內存泄漏。這將在諸如某些圖形等數據結構中發生,但是,例如,如果您正在製作葉子永遠不會倒退的樹形結構,則可以在樹的節點上使用shared_pointers,而不會出現任何問題。
正確使用shared_ptr可以大大簡化代碼,使其更易於閱讀和維護。在很多情況下使用它們是正確的選擇。
當然,如前所述,在某些情況下,使用scoped_ptr(或scoped_array)是正確的選擇。如果指針不共享,請不要使用共享指針!
最後,最新的C++標準提供了std :: tr1 :: shared_ptr模板,它現在在大多數平臺上,儘管我不認爲tr1有一個入侵指針類型(或者更確切地說, ,但我自己沒有聽說過)。
字符串通常不使用COW。它並不能很好地處理多線程應用程序,因此大多數實現都會再次丟棄它。這意味着字符串副本有點昂貴。 – jalf 2009-02-26 05:40:11