1.智慧型指標:智慧型指標就是智慧型的、自動化的管理指標所指向的動態資源的釋放,並且可以如同指標一樣使用。智慧型指標是rall(初始化立即獲取資源)思想的一種實現,其中初始化利用建構函式,之後將資源儲存起來最後讓析構函式自動清理。
2.引入智慧型指標原因:總的來說,是防止程式執行流的改變、或者人為因素造成的記憶體洩露問題,在此我們應該知道,影響執行流改變的常見語句有:goto,拋異常,return,break,continue等。
3.智慧型指標發展:
(1)最早期的auto_ptr
autoptr是一種有著嚴重缺陷的智慧型指標,缺陷在於當我們進行拷貝構造時,如果為淺拷貝時,可能會出現同一塊空間釋放多次的問題,如果為深拷貝也不合理,因為
指標的拷貝,本身就希望指向同一塊空間;因此,在拷貝構造這裡就出現了大的問題。
關於auto_ptr的模擬實現:
[cpp]view plain
copy
template
class autoptr
~autoptr()//析構函式
} //1.管理權的轉移
//問題缺陷:當乙個智慧型指標交出對空間的管理權之後,將它置空,不能再對其解引用賦值,廢掉
autoptr(autoptr& ap)//拷貝建構函式
autoptr& operator=(autoptr& ap)//賦值操作符的過載
_ptr=ap._ptr;
ap._ptr=null;//退出管理
} return *this;
} t& operator*()//過載*
t* operator->()//過載->
};
解決方案:管理權轉移
即再解決物件賦值、拷貝構造的時候,如a=b,先將a的位址空間釋放,然後將b.ptr指標賦值給a.ptr,最後將位址空間的管理權交給a.ptr,並且將 b.ptr置為null.所以,在此操作
之後,原來的指標將不能再使用,因此其缺點在於,乙個智慧型指標只能指向一塊記憶體,不能有幾個指標指向同一塊記憶體空間。
鑑於autoptr的嚴重缺陷,開發者又自主實現解決以上弊端的智慧型指標:
(2)scoped_ptr
它所採用的解決方案就是防函式,對拷貝建構函式、賦值運算子的過載宣告為私有的 或者保護的,但不去實現它,即實現了防止拷貝,防止賦值的功能
關於scoped_ptr的模擬實現:
[cpp]view plain
copy
template
class scopedptr
~scopedptr()//析構函式
} t& operator*()//*的過載
t* operator->()//過載->
//防拷貝的實現,即將拷貝構造、賦值運算子過載函式宣告成私有的,並且不定義
private:
scopedptr(const scopedptr& sp);
scopedptr& operator=(const scopedptr& sp);
};
雖然 表面上解決了auto_ptr的缺陷,但是沒有了拷貝、賦值功能,為了不僅可以 遮蔽auot_ptr缺陷,還能拷貝、賦值,我們又提出來了一下:
(3)shared_ptr
它所採用的技術是引用計數思想,在物件構造時記下使用次數,到最後只有乙個引用計數的時候再釋放,所以依然支援拷貝構造和賦值的操作
關於shared_ptr的模擬實現:
[cpp]view plain
copy
template
class sharedptr
~sharedptr()//析構函式
} sharedptr(sharedptr& sp)//拷貝建構函式
sharedptr& operator=(sharedptr& sp)//賦值運算子的過載
_ptr=sp._ptr;
++(*_refcount);
} return *this;
} t& operator*()//*的過載
t* operator->()//過載->
};
shared_ptr可以說是比較完美的智慧型指標了,解決了它之前幾個智慧型指標所存在的問題但是,它的缺陷卻在於,它存在著迴圈引用的問題:
關於迴圈引用:在使用shared_ptr時,由於節點之間的相互引用使得多個結點指向同一塊空間,引用計數不為1,從而在釋放空間時,p1等p2釋放,p2等p1釋放,從而引起的迴圈引用問題,造成記憶體洩露。
此時又提出來了以下指標:
(4)weak_ptr
weak_ptr是為了配合shared_ptr而引入的一種智慧型指標,它更像是shared_ptr的乙個助手而不是智慧型指標,因為它不具有普通指標的行為,像旁觀者那樣觀測資源的使用情況但weak_ptr沒有共享資源,它的構造不會引起指標引用計數的增加。
引入weak_ptr弱引用指標即可解決迴圈引用問題。weak_ptr不會修改引用計數。
關於weak_pt的模擬實現:
[cpp]view plain
copy
template
class weakptr
weakptr(const sharedptr& sp)
:_ptr(sp._ptr)
{}
t& operator*()//*的過載
t* operator->()//過載->
private:
t* _ptr;
};
C 智慧型指標及其原理
智慧型指標介紹 智慧型指標 raii 是利用物件的生命週期來管理資源的技術。raii,resource acquisition is initialization 顧名思義,就是在初始化物件的時候獲取資源,在這個物件進行析構時會幫我們釋放資源,這樣做的好處有很多 不需要顯示的釋放資源 可以避免因為沒...
智慧型指標 強弱智慧型指標
在平時編寫 的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。引起記憶體洩...
C 深度解析 27 智慧型指標分析
1.永恆的話題 2.程式設計實驗 include includeusing namespace std class test int value test int main system pause return 0 3.深度的思考 4.智慧型指標分析 include includeusing na...