C 10 智慧型指標

2021-08-31 09:38:36 字數 2211 閱讀 7586

智慧型指標作用:

一般的指標,存在資源洩露的問題。而智慧型指標一定會保證資源自動釋放(會自動呼叫delete),不用使用者參與。

為什麼會自動呼叫delete?

實際上智慧型指標也是用類定義的,利用棧上的指標出函式就會自動呼叫析構函式的特點。

所以不能使用堆上的指標,因為出函式不會析構。也不要定義全域性的,因為程式結束自己就釋放了。

標頭檔案:#include

1、帶引用計數的智慧型指標。

1)shared_ptr強智慧型指標  可以改變資源的引用計數。 會出現迴圈引用的問題。

如果多個shared_ptr指向了同一塊資源。該資源的引用計數就每次加1。如果不指向了就減1。當引用計數為0時,就會自動釋放該資源。

shared_ptr內部的引用計數是執行緒安全的,但是物件的讀取需要加鎖。

初始化方式:智慧型指標是個類,並不是乙個指標(雖然它的成員變數是個指標)。所以不能將乙個指標直接賦值給智慧型指標。也就是說:shared_ptrpra = new int; 這種寫法是錯的。而是應該shared_ptrpra(new int);

2)weak_ptr弱智能指標  不會改變資源的引用計數。

弱智能指標不能直接訪問物件,但如果提公升為強智慧型指標(引用計數+1)就可以訪問,用lock()方法。前提資源還存在,引用計數不為0。如果資源沒了,當然指向null。出區域性析構-1;

多執行緒也是安全的,不會出現剛提公升,就有其他執行緒析構了。因為+1了,+1是上了鎖的。

弱智能指標可以直接接受強智慧型指標.

弱智針是不可以使用->來訪問物件的。需要將弱智針提公升為強指標。shared_ptrptra = _ptra.lock();  // 提公升

shared_ptr和weak_ptr的使用建議:

結論:建立物件的地方使用強智慧型指標,其它地方一律使用弱智能指標。

2、不帶引用計數的智慧型指標。

1、auto_ptr

在c++標準提供了auto_ptr。這個智慧型指標不支援拷貝建構函式。當想ptr2(ptr1); 會將ptr1置為null,ptr2指向ptr1之前的位址。所以禁止使用c++標準可提供的auto_ptr。

可以任意轉移資源的所有權,但使用者無法感知。

2、scope_ptr

禁止拷貝構造與賦值。方式是私有的。不能任意轉化所有權。

3、unique_ptr

同一時刻只能有乙個unique_ptr指向給定的物件。不能賦值,不能拷貝。但使用者可以呼叫函式(move)還轉換所有權。

遺留問題:1、拷貝構造和賦值不能在同乙個作用域下使用,但可以在乙個函式返回時呼叫。

2、不是所有資源都是使用delete 那麼怎麼定義刪除器。

unique_ptrgetuniqueptr_1()

unique_ptrgetuniqueptr_2()

int main()

在unique_ptr中拷貝構造與賦值過載是放在public中的,通過在後面加=delete。從而達到刪除該函式的目的,導致無法使用。

但其實還提供了右值引用(c++11)的拷貝構造與賦值過載。在這裡呼叫的就是右值引用的函式。

智慧型指標的迴圈引用(交叉引用)問題:

解決方法:建立物件的地方使用強智慧型指標,其它地方一律使用弱智能指標。也就是說在類中的指標使用弱指標即可。

原因:弱指標引用計數不會加一。

乙個將弱智針提公升為強指標的例子:

class b;

class a

~a()

void func()

weak_ptr_ptrb;

};class b

~b()

void test() }

weak_ptr_ptra; // operator-> 不允許通過weak_ptr訪問物件

};int main()

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

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