產生原因:
c++沒有自動記憶體**機制。
平常我們在使用c++開發過程中,動態申請記憶體,使用new或malloc,然後通過指標去使用;
那麼,使用結束以後,必須要顯式的呼叫delete或free操作,釋放對應的動態儲存空間,不然就會產生記憶體洩露的問題。
這整個操作是需要程式設計師去進行,程式設計師的不小心就 很容易造成記憶體洩露的問題。而且記憶體洩露問題一般隱藏比較深,難以發現,也難以定位。
基於以上原因,有了智慧型指標。
技術原理:
對於編譯器而言,智慧型指標實際上是個棧物件,並非指標型別。所以在棧物件生命週期結束時,會自動呼叫該物件的析構函式,釋放它管理的堆。這樣,智慧型指標就可以方便的控制物件的生命週期。
智慧型指標本身是乙個物件,它對裸指標做了一層包裝。
智慧型指標型別:
auto_prt : 使用起來有較多坑,不建議使用。(c++11中已被棄用)
unique_ptr: 其所指向的物件在作用域之外會自動得到析構。它是non-copyable的,禁止了賦值運算子和拷貝構造,這樣是為了避免同乙個物件被多次析構,沒有release()函式。控制權唯一。無法使兩個unique_ptr指向同乙個物件。
可實現功能 :
1、為動態申請記憶體提供異常安全。
2、將動態申請的記憶體所有權傳遞給某函式。
3、從某個函式返回動態申請記憶體的所有權。
4、在容器中儲存指標。
shared_ptr:該型別智慧型指標支援拷貝和賦值的,那麼它引入了引用計數器,避免多次析構的問題,每複製一次計數器+1,指標退出作用域,則計數器-1,直到最後一次析構,才會真正的刪除物件,這樣就避免了多次析構的問題。
release():當前指標會釋放資源所有權,計數減一。
weak_ptr:為shared_ptr而準備的,是為了解決shared_ptr相互引用的死鎖問題,如果兩個share_ptr相互引用,那麼這兩個指標的引用計數永遠不可能下降為0,只對shared_ptr進行引用,不改變其引用計數。
引用計數器是執行緒安全的。
它同樣用於管理單個堆記憶體物件。
以上為常用的三種。
另外,還有用於管理多個堆記憶體物件的智慧型指標物件,在此不論。
應用場景:
確定物件無需共享的情況下,使用unique_ptr
確定物件需要共享的情況下,使用shared_ptr
weak_ptr一般常用於軟體框架設計中,沒用過。
智慧型指標的操作:
訪問智慧型指標本身的方法使用 . 操作符。
智慧型指標過載了 -> 操作符,用於操作裸指標所指向的物件。
get(); 獲取智慧型指標的裸指標
reset() ; 安全便捷的刪除智慧型指標,可以用於主動刪除智慧型指標,如在中途刪除智慧型指標釋放資源,而不是等被動呼叫析構函式。
若傳遞引數,會釋放當前記憶體,重新管理新傳入物件。
release():
c 智慧型指標
auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...
c 智慧型指標
很久沒寫部落格了,不知道如何表達了,哈哈.我先介紹一下深淺拷貝.class copy 此時a.ptr和b.ptr指向同乙個物件,當我們delete a.ptr時 b.ptr所指向的物件已經不存在了,要是我們引用b.ptr指向的物件也就會出問題了.深拷貝 把a.ptr所指向的物件拷貝乙份給b.ptr ...
c 智慧型指標
記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...