行為類似於指標的類物件,但這種物件還有其他功能。重要的區別是他負責自動釋放所指向的物件。
引入智慧型指標的原因:
在c++中,動態記憶體分配使用new、delete或new、delete建立和銷毀,但會出現使用new或new建立動態記憶體後,忘記使用delete或delete或在使用delete之前程式異常終止,造成記憶體洩露。或者在還有指標引用該記憶體時提前使用delete釋放記憶體,會產生引用非法記憶體指標問題。為此,c++11提出了智慧型指標概念。
智慧型指標模板類:
可幫助管理動態記憶體的智慧型指標模板有:auto_ptr、unique_ptr、share_ptr和weak_ptr;這四個智慧型指標模板都定義了類似指標的物件,可以將new獲得的位址賦給這種物件,當智慧型指標過期時,其析構函式將使用delete來釋放記憶體。
#include
void
remodel
(std::string & str)
auto_ptr
模板auto_ptr是c++98提供的解決方案,c++11已將其摒棄.
auto_ptr ps (
newstring
("i reigned lonely as a cloud."))
;auto_ptr vocation;
vocation = ps;
如果ps和vocation是常規指標,則兩個指標將指向同乙個string物件,當ps過期時,程式將釋放該物件,但是vocation過期時,程式也將釋放這個物件,要避免這種問題,方法有多種:
1、定義賦值運算子,使之執行深複製,這樣兩個指標將指向不同的物件,其中的乙個物件是另乙個物件的副本。
2、建立所有權概念,對於特定的物件,只能有乙個智慧型指標可擁有它,這樣只有擁有物件的智慧型指標的建構函式會刪除物件。然後,讓賦值操作轉讓所有權。這就是用於auto_ptr和unique_ptr的策略。但unique_ptr的策略更嚴格。
3、建立智慧型更高的指標,跟蹤引用特定物件的智慧型指標數,這稱為引用計數,賦值時,技術將加1,而指標國旗時,計數將減1。僅當最後乙個指標過期時,才呼叫delete。這是share_ptr採用的策略。
unique_ptr為何優於auto_ptr
auto_ptrp1(
newstring
("auto");
auto_ptr p2;
p2 = p1;
p2接管string物件的所有權後,p1的所有權被剝奪,但如果程式隨後試圖使用p1時程式可能會出現崩潰現象。
unique_ptr p3 =
newstring
("auto");
unique_ptr p4;
p4 = p3;
//error
該段程式在編譯的時候報錯,避免了p3不再指向有效資料的問題,因此,unique_ptr比auto_ptr更安全。
相比於auto_ptr和share_ptr,unique_ptr有可用於陣列的變體。
std::unique_prt<
double
>
pda(
newdouble(5
));
weak_ptr
weak_ptr解決了share_ptr迴圈引用的問題,它是一種不控制所指向物件生存期的智慧型指標,不能直接將它用來定義乙個智慧型指標,智慧型配合share_ptr。將乙個weak_ptr繫結到乙個shared_ptr不會改變shared_ptr的引用計數。一旦最後乙個指向物件的shared_ptr被銷毀,物件就會被釋放,即使有weak_ptr指向物件,物件還是會被釋放。
選擇智慧型指標
如果程式要使用多個指向同乙個物件的指標,應選擇share_ptr。
如果程式不需要多個指向同乙個物件的指標,則可使用unique_ptr。
如果程式不適用new或new分配記憶體時,則不能使用unique_ptr。
如果程式不使用new分配記憶體,則不能使用auto_ptr和share_ptr。
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 智慧型指標
記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...