C 智慧型指標

2021-10-05 06:22:39 字數 2118 閱讀 3537

行為類似於指標的類物件,但這種物件還有其他功能。重要的區別是他負責自動釋放所指向的物件。

引入智慧型指標的原因:

在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 智慧型指標

記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...