使用正常的指標 可能會遺忘歸還記憶體,而且其他的c++機制可能會打斷我們歸還的過程
智慧型指標和普通指標的區別在於智慧型指標實際上是對普通指標加了一層封裝機制,這樣的一層封裝機制的目的是為了使得智慧型指標可以方便的管理乙個物件的生命期。
智慧型指標格式 ptr
最原始的智慧型指標是 auto_ptr,allocate=delete。c++11 已淘汰
但存在兩個問題
auto_ptr 為了保證物件的唯一主權,在賦值,拷貝等地方會自動清除指向物件,出現類似空懸指標的樣子
void f(auto_ptr p);
auto_ptr p;
f(p);
p的指向就被置空了,而且 使用delete ,無法刪除陣列
unique_ptr改進了這兩點,物件和指標不同生但共死,可以顯式的使用 move 語義,release成員函式釋放控制權,不刪除物件,還可以自定義 allocate,適應陣列等型別。
#define _crt_secure_no_warnings
#include #include #include #include #include void mytest()
int main()
第二個問題 我們有分享物件控制權的需求,shared_ptr允許多個該智慧型指標共享第「擁有」同一堆分配物件的記憶體,這通過引用計數(reference counting)實現,會記錄有多少個shared_ptr共同指向乙個物件,一旦最後乙個這樣的指標被銷毀,也就是一旦某個物件的引用計數變為0,這個物件會被自動刪除。
#define _crt_secure_no_warnings
#include #include #include #include #include void mytest()
int main()
但使用share_ptr 會出現迴圈引用問題
//share_ptr可能出現迴圈引用,從而導致記憶體洩露
class a
;class b
int main()
//假設pa先離開,引用計數減一變為1,不為0因此不會呼叫class a的析構函式,因此其成員p也不會被析構,pb的引用計數仍然為2;
//同理pb離開的時候,引用計數也不能減到0
return 0;}/*
** weak_ptr是一種弱引用指標,其存在不會影響引用計數,從而解決迴圈引用的問題
*/使用weak_ptr可以解決這個問題
weak_ptr是為配合shared_ptr而引入的一種智慧型指標來協助shared_ptr工作,它可以從乙個shared_ptr或另乙個weak_ptr物件構造,它的構造和析構不會引起引用計數的增加或減少。沒有過載 * 和 -> 但可以使用lock獲得乙個可用的shared_ptr物件
weak_ptr的使用更為複雜一點,它可以指向shared_ptr指標指向的物件記憶體,卻並不擁有該記憶體,而使用weak_ptr成員lock,則可返回其指向記憶體的乙個share_ptr物件,且在所指物件記憶體已經無效時,返回指標空值nullptr。
注意:weak_ptr並不擁有資源的所有權,所以不能直接使用資源。
可以從乙個weak_ptr構造乙個shared_ptr以取得共享資源的所有權。
#define _crt_secure_no_warnings
#include #include #include #include #include void check(std::weak_ptr&wp)
else
}void mytest()
int main()
智慧型指標 強弱智慧型指標
在平時編寫 的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。引起記憶體洩...
智慧型指標 三 unique ptr使用簡介
我們知道auto ptr通過複製構造或者通過 賦值後,原來的auto ptr物件就報廢了.所有權轉移到新的物件中去了.而通過shared ptr可以讓多個智慧型指標物件同時擁有某一塊記憶體的訪問權.但假如我們不希望多個記憶體塊被多個智慧型指標物件共享,同時又不會像auto ptr那樣不知不覺的就讓原...
智慧型指標 三 unique ptr使用簡介
我們知道auto ptr通過複製構造或者通過 賦值後,原來的auto ptr物件就報廢了.所有權轉移到新的物件中去了.而通過shared ptr可以讓多個智慧型指標物件同時擁有某一塊記憶體的訪問權.但假如我們不希望多個記憶體塊被多個智慧型指標物件共享,同時又不會像auto ptr那樣不知不覺的就讓原...