如果在程式中使用new從堆(自由儲存區)分配記憶體,等到不需要時, 應使用delete將其釋放。c++引入了智慧型指標auto_ptr, 以幫助自動完成這個過程。 c++11摒棄了auto_ptr,並新增了三種智慧型指標:unique_ptr, shared_ptr, weak_ptr。
一. auto_ptr, unique_ptr , shared_ptr
標頭檔案: #include
用法: auto_ptra(new double);
unique_ptrb( new int);
shared_ptrc(new string>;
#include #include #include using namespace std;
class report
~report()
void comment() const
private:
string str;
};int main()
return 0;
}
執行結果:
所有的只能指標類都有乙個explict建構函式,該建構函式可以將指標作為引數, 因此不需要自動將指標轉換為智慧型指標物件。
shared_ptrp;
double* q = new double;
p = q; //not allowed, implicit conversion
pd = shared_ptr(q); //ok, explict conversion
智慧型指標和常規指標類似, 也能執行 解引用操作(*p), 訪問結構成員 (p -> m_), 將它賦值給同型別的常規指標。 還可以將智慧型指標物件賦給另乙個同型別的智慧型指標物件。
智慧型指標應避免如下操作:
string str("hehe");
shared_ptra(&str); //no!
ptr過期時,程式將把delete運算子用於非堆記憶體,這是錯誤的。
二.
對於指向在堆分配的記憶體的指標, 指標間賦值是不能接受的,因為程式將試圖刪除同乙個物件兩次。
要避免這種問題,方法有多種:
1. 定義賦值運算子,使之執行深複製。 這樣兩個指標將指向不同物件, 其中乙個物件是另乙個的副本。
2. 建立所有權概念, 對於特定物件, 只有乙個智慧型指標可以擁有他 ,這樣只有擁有物件的智慧型指標的建構函式會刪除物件。 然後, 讓賦值操作轉讓所有權 。 這是用於
auto_ptr 和 unique_ptr的策略, 但unique_ptr的策略更嚴格。
3. 建立智慧型更高的指標,跟蹤引用特定物件的智慧型指標數。 這稱為引用計數。 例如,賦值時, 計數加1, 指標過期時,計數減1, 僅當最後乙個指標過期時,才呼叫delete。這是shared_ptr 採用的策略。
auto_ptrp1(new string("auto");
auto_ptrp2;
p2 = p1; //ok
p2接管p1所有權後,p1的所有權將被剝奪。 這樣可以防止p1 和 p2的析構函式試圖刪除同乙個物件 。 但如果隨後試圖使用p1, 這將是件壞事, 因為p1不在指向有效的資料。
但是如果把上面的auto_ptr換成unique_ptr,編譯器會認為 p2 = p1;這句是非法的,這樣避免了p1不在指向有效資料的問題, 因為unique_ptr比auto_ptr更安全。
weak_ptr是為配合shared_ptr而引入的一種智慧型指標來協助shared_ptr工作,它可以從乙個shared_ptr或另乙個weak_ptr物件構造,它的構造和析構不會引起引用記數的增加或減少。沒有過載*和->但可以使用lock獲得乙個可用的shared_ptr物件
weak_ptr的乙個重要用途是通過lock獲得this指標的shared_ptr,使物件自己能夠生產shared_ptr來管理自己,但助手類enable_shared_from_this的shared_from_this會返回this的shared_ptr,只需要讓想被shared_ptr管理的類從它繼承即可。
C 11智慧型指標
本文介紹c 的四種智慧型指標,其中後三種是c 11新增加的,auto ptr已被棄用。要編譯c 11,需要安裝g 4.8 sudo add apt repository ppa ubuntu toolchain r test sudo apt get update sudo apt get inst...
c 11 智慧型指標
首先來看shared ptr,先貼一小部分vs2013裡的實現 template class shared ptr template class shared ptr public ptr base ty template explicit shared ptr ux px template cla...
C 11 智慧型指標
c 11中有unique ptr shared ptr與weak ptr等智慧型指標 smart pointer 定義在 memory 中。可以對動態資源進行管理,保證任何情況下,已構造的物件最終會銷毀,即它的析構函式最終會被呼叫。unique ptr持有對物件的獨有權,同一時刻只能有乙個uniqu...