智慧型指標(類模板):
智慧型指標生存的意義就是為粗心的程式設計師以及不合理的程式,例如異常情況跳出了某乙個空間的
釋放**段沒有執行釋放記憶體的**。而使用智慧型指標則為了讓指標自動處理以上問題保證記憶體
不易洩露。
*****不帶應用計數
***********auto_ptr(c++)#include*************
*這個事基本的智慧型指標,它把指標封裝成了乙個類物件。利用系統對棧上物件自動析構的特點,在
出了作用域後自動析構這個指標,防止記憶體洩露。
*注意這個指標的建構函式做了explicit宣告,所以我們不能auto_ptra=new int;必須要用
auto_ptra(new int);
*當所有權轉讓,原來的物件將會析構。這就保證乙個資源只有乙個auto_ptr與之對應,不能用於容器當中。
因為如果這樣做我vector(10).我在做拷貝構造或者給新的vec賦值原來容器裡面物件就沒有了,
這顯然不符合我們stl的要求。
*********scoped_ptr(boost)********************
與auto_ptr的區別
不能轉換所有權
boost::scoped_ptr所管理的物件生命週期僅僅侷限於乙個區間(該指標所在的"{}"之間),無法
傳到區間之外,這就意味著boost::scoped_ptr物件是不能作為函式的返回值的(std::auto_ptr可以)。
其他和我們的auto_ptr類似。
由於boost::scoped_ptr是通過delete來刪除所管理物件的,而陣列物件必須通過deletep來刪除,因此boost::scoped_ptr
是不能管理陣列物件的,如果要管理陣列物件需要使用boost::scoped_array類。
*********unique_ptr(boost)*******************888
unique_ptrap(new int(88 );
unique_ptrone (ap) ; // 會出錯
unique_ptrtwo = one;//會出錯
unique_ptr沒有這兩個函式,如果想經行如上操作可按如下兩種方法:
1.unique_ptrgetval( )
unique_ptruptr =getval(); //ok 2.
unique_ptrup(new int(88 );
unique_ptruptr2 = std:move(up) ;
//這裡是顯式的所有權轉移. 把up所指的記憶體轉給uptr2了,而up不再擁有該記憶體.另外注意如果你使用vs2008是沒有std:move這函式的.
//vs2010開始才有,是c++ 11標準出現的內容。
*區別:
我們知道scoped_ptr不可做為容器元素.而unique_ptr也同樣不能直接做為容器元素,但可以通過一點間接的手段
例如:unique_ptrsp(new int(88) );
vector> vec;
vec.push_back(std::move(sp));
sp ); 這樣不行,會報錯的. 『
所以這樣不帶引用計數的盡量不要和容器沾邊。
它在scope_ptr上加入了std:move()功能,其他跟scope_ptr類似。
*****帶引用計數:
*******************shared_ptr
底層維護了乙個引用計數,當引用計數為0的時候,我們才真正的析構這塊物件
*******************weak_ptr
**為了解決shared指標的交叉引用問題。
weak指標不增加shared的引用計數,但是weak的lock可以返回指weak空間的lock,如果這個空間被釋放了
則會返回null。
強指標可以給弱指標賦值
**shared_ptr在多個執行緒同時拿到share_ptr時候,讀操作安全寫操作不安全,盡量不要在多執行緒中,需要寫
操作使用share_ptr.
智慧型指標使用摘要
1.如果沒有拷貝 賦值等要求,優先選用scoped ptr 2.如果不需要放入容器中 放入容器中的元素型別必須是能拷貝的 優先選用scoped ptr 3.如果不需要自定義刪除器,優先選用scoped ptr 4.盡量不要用scoped array管理new出來的陣列,改用vector代替 5.只能...
C 智慧型指標使用
由於 c 語言沒有自動記憶體 機制,程式設計師每次 new 出來的記憶體都要手動 delete。程式設計師忘記 delete,流程太複雜,最終導致沒有 delete,異常導致程式過早退出,沒有執行 delete 的情況並不罕見。std auto ptr boost scoped ptr boost ...
boost 智慧型指標使用
1 scoped ptr 基本功能類似auto ptr。首先確保任何時候物件都能被正確的刪除。且 scoped ptr所有權不能轉讓,一旦獲取,無法從它那裡取回。scoped ptr 不能作為容器的元素,不允許不支援拷貝和賦值,因為拷貝和賦值函式是私有的。即,不存在 sp1 sp2 這樣的操作。sc...