智慧型指標作用:
一般的指標,存在資源洩露的問題。而智慧型指標一定會保證資源自動釋放(會自動呼叫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 智慧型指標
記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...