一文梳理C 智慧型指標

2021-10-04 08:32:02 字數 2261 閱讀 2109

c++智慧型指標主要是解決記憶體管理的問題,比如我們new delete需要成對的使用,否則會發生記憶體洩漏,智慧型指標很大程度上可以解決這個問題,智慧型指標是乙個類,當超出了類的作用類時,類會自動呼叫析構函式進行釋放;

首先介紹關於類什麼時候呼叫析構函式;

類的生命週期結束的時候

類的生命週期結束的標誌就是當類的物件不再後面存在的時候,show the code:

#include #include #include #include#include#define ll long long

using namespace std;

class a

void print()

~a()

private:

int a;

};int main()

主動呼叫delete函式

直接呼叫delete函式

物件i是物件o的成員,o的析構函式被呼叫時,物件i的析構函式也被呼叫。

#include #include #include #include#include#define ll long long

using namespace std;

class a

void print()

virtual ~a()

private:

int a;

};class c

~c()

private:

int c;

};class b :public a

~b()

private:

int b;

c c;

};int main()

首先呼叫基類a的建構函式,然後是私有成員c的建構函式,接著是b的建構函式,delete的時候,因為是放在棧中的,所以順序相反,先b再c再a。

auto_ptr

#include#include//auto_ptr的標頭檔案

using namespace std;

class test

~test()

.是呼叫類自身的函式,->是指向物件進行呼叫。當我們對智慧型指標進行賦值時,如ptest2 = ptest,ptest2會接管ptest原來的記憶體管理權,ptest會變為空指標,如果ptest2原來不為空,則它會釋放原來的資源,基於這個原因,應該避免把auto_ptr放到容器中,因為演算法對容器操作時,很難避免stl內部對容器實現了賦值傳遞操作,這樣會使容器中很多元素被置為null。判斷乙個智慧型指標是否為空不能使用if(ptest == null),應該使用if(ptest.get() == null)

成員函式

get():返回乙個原始的指標

reset():重新繫結指向的物件

release():只是把智慧型指標賦值為空,但是它原來指向的記憶體並沒有被釋放

unique_ptr

擁有它指向的物件

無法進行複製構造,無法進行複製賦值操作。即無法使兩個unique_ptr指向同乙個物件。但是可以進行移動構造和移動賦值操作

、儲存指向某個物件的指標,當它本身被刪除釋放的時候,會使用給定的刪除器釋放它指向的物件

unique_ptr 可以實現如下功能:

1、為動態申請的記憶體提供異常安全

2、講動態申請的記憶體所有權傳遞給某函式

3、從某個函式返回動態申請記憶體的所有權

4、在容器中儲存指標

share_ptr

從名字share就可以看出了資源可以被多個指標共享,它使用計數機制來表明資源被幾個指標共享。可以通過成員函式use_count()來檢視資源的所有者個數。出了可以通過new來構造,還可以通過傳入auto_ptr, unique_ptr,weak_ptr來構造。當我們呼叫release()時,當前指標會釋放資源所有權,計數減一。當計數等於0時,資源會被釋放

weak_ptr

​​​​​​​weak_ptr是用來解決shared_ptr相互引用時的死鎖問題,如果說兩個shared_ptr相互引用,那麼這兩個指標的引用計數永遠不可能下降為0,資源永遠不會釋放。它是對物件的一種弱引用,不會增加物件的引用計數,和shared_ptr之間可以相互轉化,shared_ptr可以直接賦值給它,它可以通過呼叫lock函式來獲得shared_ptr。

C 智慧型指標一

資源獲得及初始化,獲得資源馬上進行初始化 是一種利用物件生命週期來控制程式資源 如記憶體 檔案句 柄 網路連線 互斥量等等 的簡單技術。在物件構造時獲取資源,接著控制對資源的訪問使之在物件的生命週期內始終保持有效,最後在物件析構的時候釋放資源。藉此,我們實際上把管理乙份資源的責任託管給了乙個物件。智...

c 智慧型指標的問題 智慧型指標初探(一)

為什麼要有智慧型指標 在c 中,動態記憶體的管理一般是用一對運算子完成的 new和delete。new 在動態記憶體中為物件分配一塊空間並返回乙個指向該物件的指標。delete 指向乙個動態獨享的指標,銷毀物件,並釋放與之關聯的記憶體。使用new和delete動態記憶體管理經常會出現問題 忘記釋放記...

C 智慧型指標(一) auto ptr指標

智慧型指標分為四種 1 auto ptr c 98 2 unique ptr c 11 3 shared ptr c 11 4 weak ptr c 11 本篇我們只講auto ptr指標的實現 temlpate typename t class auto ptr auto ptr t operat...