1. 程式人生 > >auto_ptr 與 shared_ptr 用法和區別總結

auto_ptr 與 shared_ptr 用法和區別總結

一、std::auto_ptr 被複制後,將失去原來所致資源的所有權;*auto_ptr在標頭檔案<memory>中。

永不建立auto_ptr的容器
關於此可以看的Effective STL的條款8

因為auto_ptr並不是完美無缺的,它的確很方便,但也有缺陷,在使用時要注意避免。首先,不要將auto_ptr物件作為STL容器的元素。C++標準明確禁止這樣做,否則可能會碰到不可預見的結果

auto_ptr的另一個缺陷是將陣列作為auto_ptr的引數: auto_ptr<char>  pstr (new char[12] ); //陣列;為定義
然後釋放資源的時候不知道到底是利用delete pstr,還是 delete[] pstr;

然後收集了關於auto_ptr的幾種注意事項:
1、auto_ptr不能共享所有權。
2、auto_ptr不能指向陣列
3、auto_ptr不能作為容器的成員。
4、不能通過賦值操作來初始化auto_ptr
std::auto_ptr<int> p(new int(42));     //OK
std::auto_ptr<int> p = new int(42);    //ERROR,本想通過new int(42)來產生臨時物件temp(問題出在這裡),再由temp拷貝構造產生p。
這是因為auto_ptr 的建構函式被定義為了explicit

std::auto_ptr<int> p = auto_ptr<int>(new int(42)); //Success   
5、不要把auto_ptr放入容器

二、std::tr1::shared_ptr 是可以共享所有權的智慧指標;(推薦使用)

*shared_ptr在boost的標頭檔案模組中.在vs最新的編譯器己可用.但在vc6上卻找不到該模組.

1. shared_ptr是Boost庫所提供的一個智慧指標的實現,shared_ptr就是為了解決auto_ptr在物件所有權上的侷限性(auto_ptr是獨佔的),在使用引用計數的機制上提供了可以共享所有權的智慧指標.
2. shared_ptr比auto_ptr更安全
3. shared_ptr是可以拷貝和賦值的,拷貝行為也是等價的,並且可以被比較,這意味這它可被放入標準庫的一般容器(vector,list)和關聯容器中(map)。

關於shared_ptr的使用其實和auto_ptr差不多,只是實現上有差別,關於shared_ptr的定義就不貼程式碼了,以為內開源,可以網上找
1、shared_ptr<T> p(new Y);

再來說說shared_ptr的缺點。

1.對於使用引用計數的智慧指標來說,必須要小心出現迴圈引用。
     在重度使用
shared_ptr的系統中,你必須一開始就明確類與類的關係,以決定哪裡使用shared_ptr,哪裡使用weak_ptr,否則就會出現記憶體洩露。而shared_ptr的介面轉換的靈活性,也很容易導致智慧指標被濫用。記憶體自動管理的問題並沒有得到解決,它只是被轉移了。

2.shared_ptr使用非嵌入式設計,這樣可以使用於基本型別,比如 shared_ptr<int>。但是根據個人經驗,這種情況在很少使用。大部分情況還是使用自己設計的類。這有一個問題,就是沒有很方便的辦法實現this指標和智慧指標的轉換。標準庫中提供了enable_shared_from_this類來解決這個問題。但這已經使所謂的非嵌入式設計徒有虛名。而假如一開始採用嵌入式設計的話,則在效能代價和多執行緒設計方面具有更大的靈活性。


要了解更多關於auto_ptr的資訊,可以檢視more effective c++ 的p158頁條款28
要了解shared_ptr 類模板資訊,可以檢視boost 1.37.0中文文件,而且支援陣列的shared_array 類模板

關於boost中shared_ptr使用方法的一些例子