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...