raii是解決程式設計師忘記釋放資源的問題
raii是一種思想,可以通過類實現,在生命週期構造和析構,成對兒出現,不會記憶體洩漏。
raii最有名應該是智慧型指標:
a ut
o_pt
r\red
auto_p
tr最早期的智慧型指標,c++98
主要解決有異常
丟擲時發
生記憶體洩
漏問題}
有異常丟擲時
發生記憶體
洩漏問題
auto_ptr指向物件析構時,會刪除所有指向該物件的auto_ptr指標,避免auto_ptr建構函式建立物件。
注 意:
\green
注意:auto_ptr實際上是管理許可權的轉移,此設計本身帶有缺陷,建議什麼情況下都不要使用。
c++11新的三類智慧型指標:
s ha
red_
ptr}
shared
_ptr
:多個指標管理乙個資源,記錄引用次數,若引用次數為0,則析構資源。
核心思想,例項引
用計
數\green
例項引用計數
注 意:
\green
注意:wea
k_pt
r}
weak_p
tr:為解決迴圈引
用\green
迴圈引用
而生後文解釋如何解決迴圈引用問題。
指向shared_ptr管理的物件,只能通過shared_ptr構造或另乙個weak_ptr構造。weak_ptr只能通過lock成員函式訪問物件(c++11新增執行緒安全),不增加引用次數。
u ni
que_
ptr}
unique
_ptr
:指標物件一一對應,若想改變指標指向的內容,只能使用std::move,std::reset,std::release方法,其原理也是析構原unique_str指標和資源,新建指標賦予新資源,返回指標。
智 能指
針迴圈引
用:
\orange
智慧型指標迴圈
引用:
類a有個成員指標shared_ptr,指向類b
類b有個成員指標shared_ptr,指向類a
現在,mian函式中,使用指標shared_ptr指標pa操作類a,使用指標shared_ptr指標pb操作類b,類a和類b的引用計數都是2。
此時pa,pb生命週期結束時,pa釋放,pb釋放,類a和類b的引用計數都減1,為1,則不為0不會析構。造成記憶體洩漏。
解 決辦
法:
\orange
解決辦法
:類內引用從shared_ptr改為weak_ptr指標即可。
main函式引用不需要改。
智慧型指標和萬能指標
智慧型指標 智慧型指標 smart pointer 是儲存指向動態分配 堆 物件指標的類。除了能夠在適當的時間自動刪除指向的物件外,他們的工作機制很像c 的內建指標。智慧型指標在面對異常的時候格外有用,因為他們能夠確保正確的銷毀動態分配的物件。他們也可以用於跟蹤被多使用者共享的動態分配物件。智慧型指...
智慧型指標 強弱智慧型指標
在平時編寫 的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。引起記憶體洩...
stl智慧型指標和boost智慧型指標對比
先說說stl中的智慧型指標auto ptr,先說說auto ptr的特點。std auto ptr用來管理單個堆記憶體物件,但是獨享所有權,且不允許賦值和拷貝 沒有過載operator 所以如果在函式內部需要指標時,auto ptr是乙個不錯的選擇,但需要注意的是它不容許複製,這也就是容器 vect...