Boost庫系列 智慧型指標

2021-09-11 16:33:23 字數 1130 閱讀 6979

合理使用boost智慧型指標,直接記憶體釋放問題,你只管new,不需考慮delete,甚至new也不用你new(例如由make_shared函式返回shared_ptr智慧型指標)。

1、標頭檔案

(智慧型指標標頭檔案)

(使用make_unique()函式用到 )

(使用owner_less所有權比較函式物件時用到)

2、指標類別

boost.smart_ptr庫提供6中智慧型指標

(1)scoped_ptr:只能在本作用域內使用的智慧型指標,不能被拷貝,也就是說申請記憶體之後,直到作用域結束自動釋放之前,它唯一擁有這塊記憶體。當然在作用域結束之前,可以手動reset()進行指標重置清空。get()返回底層原始指標。

(2)scoped_array:scoped_ptr的陣列版本。

(3)shared_ptr:最有價值的智慧型指標。共享指標(早期起名為counted_ptr),內部通過記錄指標被引用的計數,剛初始申請到記憶體時計數use_count返回為1(unique()返回true),當被賦值給另乙個指標變數時,計數增加1,當乙個指向它的智慧型指標作用域結束時,計數減1,當計數變為0時,說明引用它的所有指標作用均已結束,會自動釋放該記憶體。

class a;

class b

;void main()

(4)shared_array:shared_ptr的陣列版本

(5)weak_ptr:弱指標,與shared_ptr相比,複製不會產生引用計數。lock()返回shared_ptr,並會產生引用計數。

(6)intrusive_ptr:

3、指標型別轉換函式

shared_ptr指標不能通過諸如static_cast(p.get())這種形式獲取原始指標之後進行轉型,否則操作之後不能再被shared_ptr進行正確的管理。正確的用法應該是這樣:

shared_ptrp1(new bad_exception);

auto p2 = dynamic_pointer_cast(p1);

auto p3 = static__pointer_cast(p2);

assert(p3==p1);

assert(p1.use_count()==3);

boost庫智慧型指標

程式的記憶體資源管理一直是個比較麻煩的問題,c 程式在引入智慧型指標之前,new出來的記憶體,需要自己手動的銷毀,自己去管理申請堆記憶體的生命週期。有的時候難免會遺漏對資源的釋放銷毀。智慧型指標則能很好的解決記憶體管理的問題,不但能很好的管理裸指標,還能管理記憶體資源 raii 機制。前借助boos...

Boost庫智慧型指標學習

參見 boost 程式庫完全開放指南 第3 章記憶體管理 所有示例,採用 vs2010 開發工具 vs2005 也適用 均為 win32 控制台程式。boost 庫的配置可參照 1 scoped ptr 內動態管理記憶體。但所有權不能轉讓,不能進行賦值操作。示例 如下。include stdafx....

boost庫學習 智慧型指標

智慧型指標是利用raii 在物件的建構函式中執行資源的獲取 指標的初始化 在析構函式中釋放 delete 指標 這種技法把它稱之為raii resource acquisition is initialization 資源獲取即初始化 來管理資源。其本質思想是 將堆物件的生存期用棧物件 智慧型指標 ...