2008-10-13 82 views
19

現在shared_ptr在tr1中,您認爲使用std::auto_ptr會怎樣?它們都有不同的用例,但auto_ptr的所有用例也可以用shared_ptr來解決。您是否會放棄auto_ptr或在您想明確表示只有一個班級在任何給定時間點擁有所有權的情況下繼續使用它?std :: auto_ptr的使用習慣或僅使用shared_ptr?

我的看法是,使用auto_ptr可以增加代碼的清晰度,正好通過添加細微差別和代碼設計的指示,但另一方面,它在培訓新程序員時又增添了一個微妙的問題:他們需要理解智能指針和他們工作的細節。當你在任何地方只使用一個智能指針時,你可以制定一個規則'將所有指針包裝在shared_ptr'中並且完成它。

你對此有何看法?

回答

13

爲了避免在'避免std::auto_ptr'陣營中提供更多的彈藥:auto_ptr在下一個標準(C++ 0x)中被棄用。我認爲這對於任何使用別的東西的論點來說都是足夠好的彈藥。

但是,如Konrad Rudolph所述,auto_ptr的默認替換應該可能是boost::scoped_ptrscoped_ptr的語義更接近匹配auto_ptr的語義,它旨在用於類似的用途。下一個C++ 09標準將有類似的東西叫做unique_ptr。

但是,在任何應該使用scoped_ptr的地方使用shared_ptr不會破壞任何內容,如果該對象實際上不會被共享,它只會增加非常微小的低效率來處理引用計數。所以對於永遠不會被分配給另一個對象的私人成員指針 - 使用scoped_ptr。如果指針將分發給其他人(這包括在容器中使用它們,或者如果您只想轉移所有權而不保留或共享) - 請使用shared_ptr

3

我相信「包裝shared_ptr中的所有指針」確實應該是默認模式,並且是適合給初級編碼者的建議。但是,在您提到的特殊所有權案例中,auto_ptr確實更合適,在這種情況下應該鼓勵使用它。

5

我認爲這是最好的做法是通過boost::scoped_ptr替代的std::auto_ptr所有用途,除非std::tr1::shared_ptr符合要求更好,如果你不介意使用升壓。另一方面,它確實是故意的,scoped_ptr不包括在TR1中。

+0

scoped_ptr有其用途,即不需要傳輸的單一所有權。在這些情況下,它應該代替auto_ptr。但是,在單一所有權轉移語義是適當的情況下,仍然應該使用auto_ptr。 :-) – 2008-10-13 09:33:59

+0

什麼使scoped_ptr比const auto_ptr更好?在Exceptional C++中有一個關於auto_ptr的項目,特別是關於const auto_ptr的一個段落;從閱讀有關scoped_ptr我沒有看到比const auto_ptr任何優勢。 – Roel 2008-10-13 12:16:52

+0

`auto_ptr`可能會產生所有權。通常情況下,這不是必需的。基本上,`scoped_ptr`只爲給定塊中的任意指針實現RAII。 – 2008-10-13 13:37:09

11

「使用shared_ptr無處不在」是一個很好的默認規則,當然也是教人們如何負責任地使用智能指針的一個很好的起點。但是,這並不總是最好的選擇。

如果你不需要共享所有權,shared_ptr是矯枉過正的:它必須爲引用計數分配一個單獨的內存塊,這會影響性能,而且它在文檔方面不那麼清晰。

我個人在很多地方使用std::auto_ptr,其中boost::scoped_ptr也足夠:在所有權轉移到其他地方之前,持有堆分配的對象,干預操作可能會引發其中。

C++ 0x將有std::unique_ptr補充std::shared_ptr作爲std::auto_ptr的更好替代。當它變得廣泛可用時,我會開始使用它。

28

auto_ptr在簽名方面也不錯。當一個函數的值爲auto_ptr<T>時,這意味着它將消耗T。如果函數返回auto_ptr<T>,則很明顯它會放棄所有權。這可以傳達你的生活意圖。

另一方面,使用scoped_ptr<T>意味着你不想關心T的生命週期。這也意味着你可以在更多的地方使用它。兩個智能指針都是有效的選擇,你當然可以同時在一個程序中。

相關問題